Update support for GNU BUILD notes so that version notes can contain extra informatio...
authorNick Clifton <nickc@redhat.com>
Tue, 21 Mar 2017 11:48:57 +0000 (11:48 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 21 Mar 2017 11:48:57 +0000 (11:48 +0000)
* readelf.c (print_gnu_build_attribute_name): Allow stack
protection notes to contain numeric values.  Use a colon rather
than a space to separate a string name from its values.  Decode
the numeric value of a stack protection note.
* objcopy.c (merge_gnu_build_notes): Allow version notes to
contain extra text after the protocol version number.

binutils/ChangeLog
binutils/objcopy.c
binutils/readelf.c

index 26a20d3918038f7fa19b8314c4791ef70407342b..dea3e3647d1f94247386b739deaaa46f71d60c0f 100644 (file)
@@ -1,3 +1,12 @@
+2017-03-21  Nick Clifton  <nickc@redhat.com>
+
+       * readelf.c (print_gnu_build_attribute_name): Allow stack
+       protection notes to contain numeric values.  Use a colon rather
+       than a space to separate a string name from its values.  Decode
+       the numeric value of a stack protection note.
+       * objcopy.c (merge_gnu_build_notes): Allow version notes to
+       contain extra text after the protocol version number.
+
 2017-03-20  Mark Wielaard  <mark@klomp.org>
 
        * readelf.c (process_program_headers): Move dynamic_addr check
index 868f122e174254fb6713daafec83c95bd8a00205..4af4d92a3fb026b62c00d564d2a030f31b20e568 100644 (file)
@@ -1933,7 +1933,7 @@ merge_gnu_build_notes (bfd * abfd, asection * sec, bfd_size_type size, bfd_byte
     }
 
   if (pnotes[0].namedata[0] != GNU_BUILD_ATTRIBUTE_TYPE_STRING
-      || strcmp (pnotes[0].namedata + 2, "1") != 0)
+      || pnotes[0].namedata[2] != '1')
     {
       err = _("bad GNU build attribute notes: version note not v1");
       goto done;
index 8b1d92486f8f6b9ffc96c82d27397e40599972b7..6ede2399fc574af9949e80b34438eb443d2fd49e 100644 (file)
@@ -16809,7 +16809,7 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
       break;
     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
       text = _("<stack prot>");
-      expected_types = "!+";
+      expected_types = "!+*";
       ++ name;
       break;
     case GNU_BUILD_ATTRIBUTE_RELRO:
@@ -16850,7 +16850,7 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
 
          if (len > left && ! do_wide)
            len = left;
-         printf ("%.*s ", len, name);
+         printf ("%.*s:", len, name);
          left -= len;
          name += len;
        }
@@ -16871,7 +16871,7 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
     }
 
   if (strchr (expected_types, name_type) == NULL)
-    warn (_("attribute does not have the expected type\n"));
+    warn (_("attribute does not have an expected type (%c)\n"), name_type);
 
   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
     {
@@ -16888,9 +16888,10 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
     {
     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
       {
-       unsigned int bytes = pnote->namesz - (name - pnote->namedata);
-       unsigned long val = 0;
-       unsigned int shift = 0;
+       unsigned int   bytes = pnote->namesz - (name - pnote->namedata);
+       unsigned long  val = 0;
+       unsigned int   shift = 0;
+       char *         decoded = NULL;
 
        while (bytes --)
          {
@@ -16900,33 +16901,44 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
            shift += 8;
          }
 
-       if (name_attribute == GNU_BUILD_ATTRIBUTE_PIC)
+       switch (name_attribute)
          {
-           char * pic_type = NULL;
-
+         case GNU_BUILD_ATTRIBUTE_PIC:
            switch (val)
              {
-             case 0: pic_type = "static"; break;
-             case 1: pic_type = "pic"; break;
-             case 2: pic_type = "PIC"; break;
-             case 3: pic_type = "pie"; break;
-             case 4: pic_type = "PIE"; break;
+             case 0: decoded = "static"; break;
+             case 1: decoded = "pic"; break;
+             case 2: decoded = "PIC"; break;
+             case 3: decoded = "pie"; break;
+             case 4: decoded = "PIE"; break;
+             default: break;
              }
-
-           if (pic_type != NULL)
+           break;
+         case GNU_BUILD_ATTRIBUTE_STACK_PROT:
+           switch (val)
              {
-               if (do_wide)
-                 left -= printf ("%s", pic_type);
-               else
-                 left -= printf ("%-.*s", left, pic_type);
-               break;
+               /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
+             case 0: decoded = "off"; break;
+             case 1: decoded = "on"; break;
+             case 2: decoded = "all"; break;
+             case 3: decoded = "strong"; break;
+             case 4: decoded = "explicit"; break;
+             default: break;
              }
+           break;
+         default:
+           break;
          }
 
-       if (do_wide)
-         left -= printf ("0x%lx", val);
+       if (decoded != NULL)
+         print_symbol (-left, decoded);
        else
-         left -= printf ("0x%-.*lx", left, val);
+         {
+           if (do_wide)
+             left -= printf ("0x%lx", val);
+           else
+             left -= printf ("0x%-.*lx", left, val);
+         }
       }
       break;
     case GNU_BUILD_ATTRIBUTE_TYPE_STRING: