From c871dadee1817d4b9f3ba6ee792730c9eccf88e0 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 2 Mar 2017 10:52:51 +0000 Subject: Fix snafu parsing GNU_BUILD_NOTEs on ARM and AArch64 architectures. * readelf.c (print_gnu_build_attribute_description): Use global symbols for OPEN attributes if at all possible. --- binutils/ChangeLog | 5 +++++ binutils/readelf.c | 22 ++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index fa33a43..dc93395 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2017-03-02 Nick Clifton + + * readelf.c (print_gnu_build_attribute_description): Use global + symbols for OPEN attributes if at all possible. + 2017-03-02 Jan Kratochvil * dwarf.c (debug_displays_assert): New static assertion. diff --git a/binutils/readelf.c b/binutils/readelf.c index 5cccccb..3bae045 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -16585,6 +16585,7 @@ print_gnu_build_attribute_description (Elf_Internal_Note * pnote, for (i = 0; i < pnote->descsz; i += desc_size) { + Elf_Internal_Sym * saved_sym = NULL; Elf_Internal_Sym * sym; unsigned long offset; @@ -16609,8 +16610,19 @@ print_gnu_build_attribute_description (Elf_Internal_Note * pnote, { if (strtab[sym->st_name] == 0) continue; + if (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN) - printf (_(" (file: %s)"), strtab + sym->st_name); + { + /* For OPEN attributes we prefer GLOBAL symbols, if there + is one that matches. But keep a record of a matching + LOCAL symbol, just in case that is all that we can find. */ + if (ELF_ST_BIND (sym->st_info) == STB_LOCAL) + { + saved_sym = sym; + continue; + } + printf (_(" (file: %s)"), strtab + sym->st_name); + } else if (ELF_ST_TYPE (sym->st_info) != STT_FUNC) continue; else @@ -16618,8 +16630,14 @@ print_gnu_build_attribute_description (Elf_Internal_Note * pnote, break; } } + if (sym == symtab + nsyms) - printf (_(" ()")); + { + if (saved_sym) + printf (_(" (file: %s)"), strtab + saved_sym->st_name); + else + printf (_(" ()")); + } } printf ("\n"); -- cgit v1.1