[binutils-gdb] Fix snafu parsing GNU_BUILD_NOTEs on ARM and AArch64 architectures.

Nick Clifton nickc@sourceware.org
Thu Mar 2 10:53:00 GMT 2017


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c871dadee1817d4b9f3ba6ee792730c9eccf88e0

commit c871dadee1817d4b9f3ba6ee792730c9eccf88e0
Author: Nick Clifton <nickc@redhat.com>
Date:   Thu Mar 2 10:52:51 2017 +0000

    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.

Diff:
---
 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  <nickc@redhat.com>
+
+	* readelf.c (print_gnu_build_attribute_description): Use global
+	symbols for OPEN attributes if at all possible.
+
 2017-03-02  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
 	* 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 (_(" (<symbol name unknown>)"));
+	{
+	  if (saved_sym)
+	    printf (_(" (file: %s)"), strtab + saved_sym->st_name);
+	  else
+	    printf (_(" (<symbol name unknown>)"));
+	}
     }
 
   printf ("\n");



More information about the Binutils-cvs mailing list