This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Update support for GNU BUILD notes so that version notes can contain extra information, and stack pr


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

commit 75d7d2986cf896fac8f0690db68ebc552e0b0339
Author: Nick Clifton <nickc@redhat.com>
Date:   Tue Mar 21 11:48:57 2017 +0000

    Update support for GNU BUILD notes so that version notes can contain extra information, and stack protection notes can contain numeric values.
    
    	* 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.

Diff:
---
 binutils/ChangeLog |  9 ++++++++
 binutils/objcopy.c |  2 +-
 binutils/readelf.c | 60 ++++++++++++++++++++++++++++++++----------------------
 3 files changed, 46 insertions(+), 25 deletions(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 26a20d3..dea3e36 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -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
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index 868f122..4af4d92 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -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;
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 8b1d924..6ede239 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -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:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]