DTrace: stack() does not print kernel module functions for i386
Andriy Gapon
avg at FreeBSD.org
Mon Nov 24 21:22:06 UTC 2014
On 23/11/2014 04:18, Mark Johnston wrote:
> On Thu, Nov 13, 2014 at 07:49:27PM -0800, Rui Paulo wrote:
>> On Nov 13, 2014, at 10:36, John Baldwin <jhb at freebsd.org> wrote:
>>> Why have the #ifdef? In theory other platforms besides amd64 could use
>>> sys/kern/link_elf_obj.c. It doesn't hurt to just let the code always accept
>>> both ET_DYN and ET_REL does it?
>>
>> No, it doesn't hurt.
>
> The suggested patch doesn't seem quite right; there are other functions
> in dt_module.c with the same assignment (i.e.
> "is_elf_obj = ehdr.e_type == ET_REL"), but the same modification is not
> correct in all cases - fixing it everywhere breaks stack() again - and
> "is_elf_obj" seems like the wrong name if DSOs are counted as well.
>
> The root of the problem is that dmp->dm_*_va offsets don't have the kld
> load address taken into account on i386, since they're currently set based
> only on the ELF section addresses. This is handled by
> dmp->dm_reloc_offset for symbols, but that's a separate case.
>
> When is_elf_obj is true, we include the load address when setting the
> dmp->dm_*_va fields. I suggest we do that unconditionally, and only set
> elements of dmp->dm_sec_offsets if is_elf_obj is true. This fixes the
> bug for me on i386. Any opinions?
This totally makes sense to me.
Thank you!
> diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c
> index e3905c1..9dd52b5 100644
> --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c
> +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c
> @@ -1211,13 +1211,13 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
> #if defined(__FreeBSD__)
> if (sh.sh_size == 0)
> continue;
> - if (is_elf_obj && (sh.sh_type == SHT_PROGBITS ||
> - sh.sh_type == SHT_NOBITS)) {
> + if (sh.sh_type == SHT_PROGBITS || sh.sh_type == SHT_NOBITS) {
> alignmask = sh.sh_addralign - 1;
> mapbase += alignmask;
> mapbase &= ~alignmask;
> sh.sh_addr = mapbase;
> - dmp->dm_sec_offsets[elf_ndxscn(sp)] = sh.sh_addr;
> + if (is_elf_obj)
> + dmp->dm_sec_offsets[elf_ndxscn(sp)] = sh.sh_addr;
> mapbase += sh.sh_size;
> }
> #endif
>
--
Andriy Gapon
More information about the freebsd-hackers
mailing list