Messages in this thread | | | Subject | Re: [PATCH] perf symbol: ignore $a/$d symbols for ARM modules | From | James Clark <> | Date | Wed, 27 Oct 2021 11:23:57 +0100 |
| |
On 27/10/2021 10:52, Lexi Shao wrote: > On ARM machine, kernel symbols from modules can be resolved to $a > instead of printing the actual symbol name. Ignore symbols starting with > "$" when building kallsyms rbtree. > > A sample stacktrace is shown as follows: > > c0f2e39c schedule_hrtimeout+0x14 ([kernel.kallsyms]) > bf4a66d8 $a+0x78 ([test_module]) > c0a4f5f4 kthread+0x15c ([kernel.kallsyms]) > c0a001f8 ret_from_fork+0x14 ([kernel.kallsyms]) > > On ARM machine, $a/$d symbols are used by the compiler to mark the > beginning of code/data part in code section. These symbols are filtered > out when linking vmlinux(see scripts/kallsyms.c ignored_prefixes), but > are left on modules. So there are $a symbols in /proc/kallsyms which > share the same addresses with the actual module symbols and confuses perf > when resolving symbols.
Hi Lexi,
Is it worth using or re-implementing the entire is_ignored_symbol() function from scripts/kallsyms.c? It seems like this change only fixes one occurrence, but is_ignored_symbol() has a big list of other cases.
Unless those cases are different?
Thanks James
> > After this patch, the module symbol name is printed: > > c0f2e39c schedule_hrtimeout+0x14 ([kernel.kallsyms]) > bf4a66d8 test_func+0x78 ([test_module]) > c0a4f5f4 kthread+0x15c ([kernel.kallsyms]) > c0a001f8 ret_from_fork+0x14 ([kernel.kallsyms]) > > Signed-off-by: Lexi Shao <shaolexi@huawei.com> > --- > tools/perf/util/symbol.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c > index 0fc9a5410739..35116aed74eb 100644 > --- a/tools/perf/util/symbol.c > +++ b/tools/perf/util/symbol.c > @@ -702,6 +702,10 @@ static int map__process_kallsym_symbol(void *arg, const char *name, > if (!symbol_type__filter(type)) > return 0; > > + /* Ignore local symbols for ARM modules */ > + if (name[0] == '$') > + return 0; > + > /* > * module symbols are not sorted so we add all > * symbols, setting length to 0, and rely on >
| |