mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
perf symbol: Look for ImageBase in PE file to compute .text offset
Instead of using the file offset in the debug file. This fixes a regression from00a3423492
("perf symbols: Make dso__load_bfd_symbols() load PE files from debug cache only"), causing incorrect symbol resolution when debug file have been stripped from non-debug sections (in which case its .text section is empty and doesn't have any file position). The debug files could also be created with a different file alignment, and have different file positions from the mmap-ed binary, or have the section reordered. This instead looks for the file image base, using the corresponding bfd *ABS* symbols. As PE symbols only have 4 bytes, it also needs to keep .text section vma high bits. Signed-off-by: Remi Bernon <rbernon@codeweavers.com> Fixes:00a3423492
("perf symbols: Make dso__load_bfd_symbols() load PE files from debug cache only") Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Nicholas Fraser <nfraser@codeweavers.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lore.kernel.org/lkml/20210909192637.4139125-1-rbernon@codeweavers.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
51ae7fa62d
commit
d2930ede52
@ -1581,10 +1581,6 @@ int dso__load_bfd_symbols(struct dso *dso, const char *debugfile)
|
||||
if (bfd_get_flavour(abfd) == bfd_target_elf_flavour)
|
||||
goto out_close;
|
||||
|
||||
section = bfd_get_section_by_name(abfd, ".text");
|
||||
if (section)
|
||||
dso->text_offset = section->vma - section->filepos;
|
||||
|
||||
symbols_size = bfd_get_symtab_upper_bound(abfd);
|
||||
if (symbols_size == 0) {
|
||||
bfd_close(abfd);
|
||||
@ -1602,6 +1598,22 @@ int dso__load_bfd_symbols(struct dso *dso, const char *debugfile)
|
||||
if (symbols_count < 0)
|
||||
goto out_free;
|
||||
|
||||
section = bfd_get_section_by_name(abfd, ".text");
|
||||
if (section) {
|
||||
for (i = 0; i < symbols_count; ++i) {
|
||||
if (!strcmp(bfd_asymbol_name(symbols[i]), "__ImageBase") ||
|
||||
!strcmp(bfd_asymbol_name(symbols[i]), "__image_base__"))
|
||||
break;
|
||||
}
|
||||
if (i < symbols_count) {
|
||||
/* PE symbols can only have 4 bytes, so use .text high bits */
|
||||
dso->text_offset = section->vma - (u32)section->vma;
|
||||
dso->text_offset += (u32)bfd_asymbol_value(symbols[i]);
|
||||
} else {
|
||||
dso->text_offset = section->vma - section->filepos;
|
||||
}
|
||||
}
|
||||
|
||||
qsort(symbols, symbols_count, sizeof(asymbol *), bfd_symbols__cmpvalue);
|
||||
|
||||
#ifdef bfd_get_section
|
||||
|
Loading…
Reference in New Issue
Block a user