Skip to content

Commit 1efde27

Browse files
mhiramatacmel
authored andcommitted
perf probe: Do not depend on dwfl_module_addrsym()
Do not depend on dwfl_module_addrsym() because it can fail on user-space shared libraries. Actually, same bug was fixed by commit 664fee3 ("perf probe: Do not use dwfl_module_addrsym if dwarf_diename finds symbol name"), but commit 07d3698 ("perf probe: Fix wrong address verification) reverted to get actual symbol address from symtab. This fixes it again by getting symbol address from DIE, and only if the DIE has only address range, it uses dwfl_module_addrsym(). Fixes: 07d3698 ("perf probe: Fix wrong address verification) Reported-by: Alexandre Ghiti <[email protected]> Signed-off-by: Masami Hiramatsu <[email protected]> Tested-by: Alexandre Ghiti <[email protected]> Cc: Alexander Shishkin <[email protected]> Cc: Greg Kroah-Hartman <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Sasha Levin <[email protected]> Link: http://lore.kernel.org/lkml/158281812176.476.14164573830975116234.stgit@devnote2 Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 6b8d68f commit 1efde27

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

tools/perf/util/probe-finder.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -637,14 +637,19 @@ static int convert_to_trace_point(Dwarf_Die *sp_die, Dwfl_Module *mod,
637637
return -EINVAL;
638638
}
639639

640-
/* Try to get actual symbol name from symtab */
641-
symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
640+
if (dwarf_entrypc(sp_die, &eaddr) == 0) {
641+
/* If the DIE has entrypc, use it. */
642+
symbol = dwarf_diename(sp_die);
643+
} else {
644+
/* Try to get actual symbol name and address from symtab */
645+
symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
646+
eaddr = sym.st_value;
647+
}
642648
if (!symbol) {
643649
pr_warning("Failed to find symbol at 0x%lx\n",
644650
(unsigned long)paddr);
645651
return -ENOENT;
646652
}
647-
eaddr = sym.st_value;
648653

649654
tp->offset = (unsigned long)(paddr - eaddr);
650655
tp->address = (unsigned long)paddr;

0 commit comments

Comments
 (0)