Thread (3 messages) flat view 3 messages, 2 authors, 2021-01-15

Re: [PATCH] perf tools: Resolve symbols against debug file first

From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2021-01-14 11:18:29
Also in: lkml

Namhyung Kim [off-list ref] writes:
On Wed, Jan 13, 2021 at 8:43 PM Jiri Slaby [off-list ref] wrote:
quoted
On 13. 01. 21, 11:46, Jiri Olsa wrote:
quoted
On Wed, Jan 13, 2021 at 09:01:28AM +0100, Jiri Slaby wrote:
quoted
With LTO, there are symbols like these:
/usr/lib/debug/usr/lib64/libantlr4-runtime.so.4.8-4.8-1.4.x86_64.debug
  10305: 0000000000955fa4     0 NOTYPE  LOCAL  DEFAULT   29 Predicate.cpp.2bc410e7

This comes from a runtime/debug split done by the standard way:
objcopy --only-keep-debug $runtime $debug
objcopy --add-gnu-debuglink=$debugfn -R .comment -R .GCC.command.line --strip-all $runtime
...
quoted
quoted
quoted
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index f3577f7d72fe..a31b716fa61c 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -1226,12 +1226,20 @@ int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
             if (sym.st_shndx == SHN_ABS)
                     continue;

-            sec = elf_getscn(runtime_ss->elf, sym.st_shndx);
+            sec = elf_getscn(syms_ss->elf, sym.st_shndx);
             if (!sec)
                     goto out_elf_end;
we iterate symbols from syms_ss, so the fix seems to be correct
to call elf_getscn on syms_ss, not on runtime_ss as we do now

I'd think this worked only when runtime_ss == syms_ss
No, because the headers are copied 1:1 from runtime_ss to syms_ss. And
runtime_ss is then stripped, so only .debug* sections are removed there.
(And syms_ss's are set as NOBITS.)

We iterated .debug* sections in syms_ss and used runtime_ss section
_headers_ only to adjust symbols (sometimes). That worked.
It seems PPC has an opd section only in the runtime_ss and that's why
we use it for section headers.
At least on my system (Ubuntu 20.04.1) I see .opd in the debug file with
NOBITS set:

$ readelf -e vmlinux.debug | grep opd
  [37] .opd              NOBITS           c000000001c1f548  01202e14


But possibly that's not the case with older toolchains?

cheers
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help