[binutils-gdb] Add support for NetBSD PaX notes to readelf.

Nick Clifton nickc@sourceware.org
Wed Jun 12 13:51:00 GMT 2019


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

commit 9abca70219e8e15991b9a4d3034672c9f720234f
Author: Christos Zoulas <christos@zoulas.com>
Date:   Wed Jun 12 14:51:17 2019 +0100

    Add support for NetBSD PaX notes to readelf.
    
    	PR 24663
    	* readelf.c (process_netbsd_elf_note): Add support for
    	NT_NETBSD_PAX.
    	(process_note): Add support for PaX notes.

Diff:
---
 binutils/ChangeLog |  7 +++++++
 binutils/readelf.c | 47 ++++++++++++++++++++++++++++++++---------------
 2 files changed, 39 insertions(+), 15 deletions(-)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 2d80604..762c9c1 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,5 +1,12 @@
 2019-06-12  Christos Zoulas  <christos@zoulas.com>
 
+	PR 24663
+	* readelf.c (process_netbsd_elf_note): Add support for
+	NT_NETBSD_PAX.
+	(process_note): Add support for PaX notes.
+
+2019-06-12  Christos Zoulas  <christos@zoulas.com>
+
 	PR 24665
 	* readelf.c (get_netbsd_elfcore_note_type): Add support for SH
 	core notes.
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 4ed1ba1..4ed948c 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -2412,7 +2412,7 @@ get_machine_name (unsigned e_machine)
     case EM_TPC:		return "Tenor Network TPC processor";
     case EM_SNP1K:	        return "Trebia SNP 1000 processor";
       /* 100 */
-    case EM_ST200:		return "STMicroelectronics ST200 microcontroller";  
+    case EM_ST200:		return "STMicroelectronics ST200 microcontroller";
     case EM_IP2K_OLD:
     case EM_IP2K:		return "Ubicom IP2xxx 8-bit microcontrollers";
     case EM_MAX:		return "MAX Processor";
@@ -2528,7 +2528,7 @@ get_machine_name (unsigned e_machine)
     case EM_MT:                 return "Morpho Techologies MT processor";
     case EM_ALPHA:		return "Alpha";
     case EM_WEBASSEMBLY:	return "Web Assembly";
-    case EM_DLX:		return "OpenDLX";  
+    case EM_DLX:		return "OpenDLX";
     case EM_XSTORMY16:		return "Sanyo XStormy16 CPU core";
     case EM_IQ2000:       	return "Vitesse IQ2000";
     case EM_M32C_OLD:
@@ -11136,7 +11136,7 @@ get_symbol_visibility (unsigned int visibility)
 
 static const char *
 get_alpha_symbol_other (unsigned int other)
-{   
+{
   switch (other)
     {
     case STO_ALPHA_NOPV:       return "NOPV";
@@ -11144,7 +11144,7 @@ get_alpha_symbol_other (unsigned int other)
     default:
       error (_("Unrecognized alpah specific other value: %u"), other);
       return _("<unknown>");
-    } 
+    }
 }
 
 static const char *
@@ -11549,7 +11549,7 @@ get_symbol_version_string (Filedata *                   filedata,
 
       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
 	{
-	  if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE) 
+	  if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE)
 	    return NULL;
 
 	  off -= ivd.vd_next;
@@ -12598,7 +12598,7 @@ is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
     case EM_OR1K:
       return reloc_type == 1; /* R_OR1K_32.  */
     case EM_PARISC:
-      return (reloc_type == 1 /* R_PARISC_DIR32.  */	      
+      return (reloc_type == 1 /* R_PARISC_DIR32.  */
 	      || reloc_type == 2 /* R_PARISC_DIR21L.  */
 	      || reloc_type == 41); /* R_PARISC_SECREL32.  */
     case EM_PJ:
@@ -13993,7 +13993,7 @@ load_specific_debug_section (enum dwarf_section_display_enum  debug,
   struct dwarf_section * section = &debug_displays [debug].section;
   char buf [64];
   Filedata * filedata = (Filedata *) data;
-  
+
   if (section->start != NULL)
     {
       /* If it is already loaded, do nothing.  */
@@ -17955,7 +17955,7 @@ print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
     case NT_GNU_PROPERTY_TYPE_0:
       print_gnu_property_note (filedata, pnote);
       break;
-      
+
     default:
       /* Handle unrecognised types.  An error message should have already been
 	 created by get_gnu_elf_note_type(), so all that we need to do is to
@@ -18075,10 +18075,23 @@ process_netbsd_elf_note (Elf_Internal_Note * pnote)
       return TRUE;
 
     case NT_NETBSD_MARCH:
-      printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
+      printf ("  NetBSD\t\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
 	      pnote->descdata);
       return TRUE;
 
+#ifdef   NT_NETBSD_PAX
+    case NT_NETBSD_PAX:
+      version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
+      printf ("  NetBSD\t\t0x%08lx\tPaX <%s%s%s%s%s%s>\n", pnote->descsz,
+	      ((version & NT_NETBSD_PAX_MPROTECT) ? "+mprotect" : ""),
+	      ((version & NT_NETBSD_PAX_NOMPROTECT) ? "-mprotect" : ""),
+	      ((version & NT_NETBSD_PAX_GUARD) ? "+guard" : ""),
+	      ((version & NT_NETBSD_PAX_NOGUARD) ? "-guard" : ""),
+	      ((version & NT_NETBSD_PAX_ASLR) ? "+ASLR" : ""),
+	      ((version & NT_NETBSD_PAX_NOASLR) ? "-ASLR" : ""));
+      return TRUE;
+#endif
+
     default:
       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
 	      pnote->type);
@@ -18267,7 +18280,7 @@ print_stapsdt_note (Elf_Internal_Note *pnote)
     }
   else
     goto stapdt_note_too_small;
-  
+
   if (data >= data_end)
     goto stapdt_note_too_small;
   maxlen = data_end - data;
@@ -18594,7 +18607,7 @@ same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
 
   a1 = find_section_by_address (filedata, addr1);
   a2 = find_section_by_address (filedata, addr2);
-  
+
   return a1 == a2 && a1 != NULL;
 }
 
@@ -18658,7 +18671,7 @@ print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
       start = byte_get ((unsigned char *) pnote->descdata, 8);
       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
       break;
-      
+
     default:
       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
       printf (_("    <invalid descsz>"));
@@ -18953,7 +18966,7 @@ print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
 
   if (do_wide && left > 0)
     printf ("%-*s", left, " ");
-    
+
   return TRUE;
 }
 
@@ -18991,6 +19004,10 @@ process_note (Elf_Internal_Note *  pnote,
     /* NetBSD-specific core file notes.  */
     return process_netbsd_elf_note (pnote);
 
+  else if (const_strneq (pnote->namedata, "PaX"))
+    /* NetBSD-specific core file notes.  */
+    return process_netbsd_elf_note (pnote);
+
   else if (strneq (pnote->namedata, "SPU/", 4))
     {
       /* SPU-specific core file notes.  */
@@ -19974,7 +19991,7 @@ process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
 	  /* PR 24049 - we cannot use filedata->file_name as this will
 	     have already been freed.  */
 	  error (_("%s: failed to read archive header\n"), arch.file_name);
-	    
+
           ret = FALSE;
           break;
         }
@@ -20068,7 +20085,7 @@ process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
 
 	  thin_filedata.handle = nested_arch.file;
 	  thin_filedata.file_name = qualified_name;
-	  
+
           if (! process_object (& thin_filedata))
 	    ret = FALSE;
         }



More information about the Binutils-cvs mailing list