----- Original Message -----
----- Original Message -----
> We are using ELFXX_sym->st_info directly as the 'type' of symbol,
> which is wrong, because st_info contains numeric value which needs
> to be mapped to appropriate type character.
I'm confused here. If I dump each module symbol's st_info fields as they are
being read/initialized, they always contain the unsigned char ASCII value for
either 't', 'r', 'd', 'b' or 'w'. What do you
mean that it needs to be mapped
to the appropriate type character?
And for that matter, since your patch marks all module symbols as type '?',
commands like "dis" fail to recognize a module text address as such, and
therefore fails to complete the command. For example, without the patch:
crash> sym dm_put
ffffffffa0000520 (t) dm_put [dm_mod]
crash> dis dm_put
0xffffffffa0000520 <dm_put>: nopl 0x0(%rax,%rax,1) [FTRACE NOP]
0xffffffffa0000525 <dm_put+5>: push %rbp
0xffffffffa0000526 <dm_put+6>: mov %rsp,%rbp
0xffffffffa0000529 <dm_put+9>: lock decl 0x180(%rdi)
0xffffffffa0000530 <dm_put+16>: pop %rbp
0xffffffffa0000531 <dm_put+17>: retq
crash>
With your patch applied:
crash> sym dm_put
ffffffffa0000520 (?) dm_put [dm_mod]
crash> dis dm_put
0xffffffffa0000520 <dm_put>: nopl 0x0(%rax,%rax,1) [FTRACE NOP]
crash>
Dave
Dave
> Sections headers are
> also required to correctly map st_info to symbol type which are
> missing here (lm->mod_section_data is NULL). Use '?' for now. This
> fixes 'trace' extension which segfaults internally while parsing
> module kallsyms:
>
> Before patch:
> crash> trace show
> crash>
>
> After patch:
> crash> trace show
> cpus=4
> <idle>-0 [002] 4350.912553: function: __hrtimer_get_next_event <--
> hrtime
> <idle>-0 [002] 4350.912553: function: __hrtimer_next_event_base <--
> __hrt
>
> Signed-off-by: Ravi Bangoria <ravi.bangoria(a)linux.ibm.com>
> ---
> symbols.c | 14 ++++++++++++--
> 1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/symbols.c b/symbols.c
> index e73e735..4456cd3 100644
> --- a/symbols.c
> +++ b/symbols.c
> @@ -2188,7 +2188,12 @@ Elf32_Sym_to_common(Elf32_Sym *e32, struct
> elf_common
> *ec)
> ec->st_name = (ulong)e32->st_name;
> ec->st_value = (ulong)e32->st_value;
> ec->st_shndx = (ulong)e32->st_shndx;
> - ec->st_info = e32->st_info;
> + /*
> + * Section headers are required to correctly map st_info
> + * to symbol type, which are missing here. Let's use '?'
> + * for all kernel module symbols type.
> + */
> + ec->st_info = '?';
> ec->st_size = (ulong)e32->st_size;
> }
>
> @@ -2198,7 +2203,12 @@ Elf64_Sym_to_common(Elf64_Sym *e64, struct
> elf_common
> *ec)
> ec->st_name = (ulong)e64->st_name;
> ec->st_value = (ulong)e64->st_value;
> ec->st_shndx = (ulong)e64->st_shndx;
> - ec->st_info = e64->st_info;
> + /*
> + * Section headers are required to correctly map st_info
> + * to symbol type, which are missing here. Let's use '?'
> + * for all kernel module symbols type.
> + */
> + ec->st_info = '?';
> ec->st_size = (ulong)e64->st_size;
> }
>
> --
> 1.8.3.1
>
> --
> Crash-utility mailing list
> Crash-utility(a)redhat.com
>
https://www.redhat.com/mailman/listinfo/crash-utility
>
--
Crash-utility mailing list
Crash-utility(a)redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility