| From 94c3b18a6cb7e5af45ae855f0e82846a303177b8 Mon Sep 17 00:00:00 2001 |
| From: Masami Hiramatsu <mhiramat@kernel.org> |
| Date: Fri, 28 Feb 2020 00:42:01 +0900 |
| Subject: [PATCH] perf probe: Do not depend on dwfl_module_addrsym() |
| |
| commit 1efde2754275dbd9d11c6e0132a4f09facf297ab upstream. |
| |
| Do not depend on dwfl_module_addrsym() because it can fail on user-space |
| shared libraries. |
| |
| Actually, same bug was fixed by commit 664fee3dc379 ("perf probe: Do not |
| use dwfl_module_addrsym if dwarf_diename finds symbol name"), but commit |
| 07d369857808 ("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: 07d369857808 ("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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c |
| index 4bcea5b97f8a..c400133e9e69 100644 |
| --- a/tools/perf/util/probe-finder.c |
| +++ b/tools/perf/util/probe-finder.c |
| @@ -609,14 +609,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; |
| -- |
| 2.7.4 |
| |