perf probe: Do not depend on dwfl_module_addrsym()
commit1efde27542
upstream. Do not depend on dwfl_module_addrsym() because it can fail on user-space shared libraries. Actually, same bug was fixed by commit664fee3dc3
("perf probe: Do not use dwfl_module_addrsym if dwarf_diename finds symbol name"), but commit07d3698578
("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:07d3698578
("perf probe: Fix wrong address verification) Reported-by: Alexandre Ghiti <alex@ghiti.fr> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> Tested-by: Alexandre Ghiti <alex@ghiti.fr> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sasha Levin <sashal@kernel.org> Link: http://lore.kernel.org/lkml/158281812176.476.14164573830975116234.stgit@devnote2 Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5f2b792d31
commit
a2d866c50a
|
@ -615,14 +615,19 @@ static int convert_to_trace_point(Dwarf_Die *sp_die, Dwfl_Module *mod,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Try to get actual symbol name from symtab */
|
||||
symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
|
||||
if (dwarf_entrypc(sp_die, &eaddr) == 0) {
|
||||
/* If the DIE has entrypc, use it. */
|
||||
symbol = dwarf_diename(sp_die);
|
||||
} else {
|
||||
/* Try to get actual symbol name and address from symtab */
|
||||
symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
|
||||
eaddr = sym.st_value;
|
||||
}
|
||||
if (!symbol) {
|
||||
pr_warning("Failed to find symbol at 0x%lx\n",
|
||||
(unsigned long)paddr);
|
||||
return -ENOENT;
|
||||
}
|
||||
eaddr = sym.st_value;
|
||||
|
||||
tp->offset = (unsigned long)(paddr - eaddr);
|
||||
tp->address = (unsigned long)paddr;
|
||||
|
|
Loading…
Reference in New Issue