Fix snafu parsing GNU_BUILD_NOTEs on ARM and AArch64 architectures.
authorNick Clifton <nickc@redhat.com>
Thu, 2 Mar 2017 10:52:51 +0000 (10:52 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 2 Mar 2017 10:52:51 +0000 (10:52 +0000)
* readelf.c (print_gnu_build_attribute_description): Use global
symbols for OPEN attributes if at all possible.

binutils/ChangeLog
binutils/readelf.c

index fa33a43..dc93395 100644 (file)
@@ -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.
index 5cccccb..3bae045 100644 (file)
@@ -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");