On Fri, Aug 21, 2020 at 06:52:36PM +0200, Remi Bernon wrote: > Wine generates PE binaries for most of its modules and perf is unable > to parse these files to get build_id or .gnu_debuglink section. > > Using libbfd when available, instead of libelf, makes it possible to > resolve debug file location regardless of the dso binary format. > > Signed-off-by: Remi Bernon <rber...@codeweavers.com> > Cc: Alexander Shishkin <alexander.shish...@linux.intel.com> > Cc: Arnaldo Carvalho de Melo <a...@kernel.org> > Cc: Ingo Molnar <mi...@redhat.com> > Cc: Jiri Olsa <jo...@redhat.com> > Cc: Mark Rutland <mark.rutl...@arm.com> > Cc: Namhyung Kim <namhy...@kernel.org> > Cc: Peter Zijlstra <pet...@infradead.org> > Cc: Jacek Caban <ja...@codeweavers.com> > --- > > v3: Rebase and small changes to PATCH 2/3 and and PATCH 3/3.
all 3 patches look ok to me especially since I found out the new code for loading symbols is for non ELF objects only ;-) it'd be great if somebody with libbfd skills could review this, but for me it looks ok.. for patchset: Acked-by: Jiri Olsa <jo...@redhat.com> thanks, jirka > > tools/perf/util/symbol-elf.c | 80 ++++++++++++++++++++++++++++++++++-- > 1 file changed, 77 insertions(+), 3 deletions(-) > > diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c > index 8cc4b0059fb0..f7432c4a4154 100644 > --- a/tools/perf/util/symbol-elf.c > +++ b/tools/perf/util/symbol-elf.c > @@ -50,6 +50,10 @@ typedef Elf64_Nhdr GElf_Nhdr; > #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ > #endif > > +#ifdef HAVE_LIBBFD_SUPPORT > +#define PACKAGE 'perf' > +#include <bfd.h> > +#else > #ifdef HAVE_CPLUS_DEMANGLE_SUPPORT > extern char *cplus_demangle(const char *, int); > > @@ -65,9 +69,7 @@ static inline char *bfd_demangle(void __maybe_unused *v, > { > return NULL; > } > -#else > -#define PACKAGE 'perf' > -#include <bfd.h> > +#endif > #endif > #endif > > @@ -530,6 +532,36 @@ static int elf_read_build_id(Elf *elf, void *bf, size_t > size) > return err; > } > > +#ifdef HAVE_LIBBFD_SUPPORT > + > +int filename__read_build_id(const char *filename, void *bf, size_t size) > +{ > + int err = -1; > + bfd *abfd; > + > + abfd = bfd_openr(filename, NULL); > + if (!abfd) > + return -1; > + > + if (!bfd_check_format(abfd, bfd_object)) { > + pr_debug2("%s: cannot read %s bfd file.\n", __func__, filename); > + goto out_close; > + } > + > + if (!abfd->build_id || abfd->build_id->size > size) > + goto out_close; > + > + memcpy(bf, abfd->build_id->data, abfd->build_id->size); > + memset(bf + abfd->build_id->size, 0, size - abfd->build_id->size); > + err = abfd->build_id->size; > + > +out_close: > + bfd_close(abfd); > + return err; > +} > + > +#else > + > int filename__read_build_id(const char *filename, void *bf, size_t size) > { > int fd, err = -1; > @@ -557,6 +589,8 @@ int filename__read_build_id(const char *filename, void > *bf, size_t size) > return err; > } > > +#endif > + > int sysfs__read_build_id(const char *filename, void *build_id, size_t size) > { > int fd, err = -1; > @@ -608,6 +642,44 @@ int sysfs__read_build_id(const char *filename, void > *build_id, size_t size) > return err; > } > > +#ifdef HAVE_LIBBFD_SUPPORT > + > +int filename__read_debuglink(const char *filename, char *debuglink, > + size_t size) > +{ > + int err = -1; > + asection *section; > + bfd *abfd; > + > + abfd = bfd_openr(filename, NULL); > + if (!abfd) > + return -1; > + > + if (!bfd_check_format(abfd, bfd_object)) { > + pr_debug2("%s: cannot read %s bfd file.\n", __func__, filename); > + goto out_close; > + } > + > + section = bfd_get_section_by_name(abfd, ".gnu_debuglink"); > + if (!section) > + goto out_close; > + > + if (section->size > size) > + goto out_close; > + > + if (!bfd_get_section_contents(abfd, section, debuglink, 0, > + section->size)) > + goto out_close; > + > + err = 0; > + > +out_close: > + bfd_close(abfd); > + return err; > +} > + > +#else > + > int filename__read_debuglink(const char *filename, char *debuglink, > size_t size) > { > @@ -660,6 +732,8 @@ int filename__read_debuglink(const char *filename, char > *debuglink, > return err; > } > > +#endif > + > static int dso__swap_init(struct dso *dso, unsigned char eidata) > { > static unsigned int const endian = 1; > -- > 2.28.0 >