Add .note.gnu.property runtime verification and merge support
[external/binutils.git] / binutils / readelf.c
index cc16816..7f22c58 100644 (file)
@@ -5101,6 +5101,9 @@ process_program_headers (Filedata * filedata)
   unsigned int i;
   Elf_Internal_Phdr * previous_load = NULL;
 
+  dynamic_addr = 0;
+  dynamic_size = 0;
+
   if (filedata->file_header.e_phnum == 0)
     {
       /* PR binutils/12467.  */
@@ -5151,9 +5154,6 @@ process_program_headers (Filedata * filedata)
        }
     }
 
-  dynamic_addr = 0;
-  dynamic_size = 0;
-
   for (i = 0, segment = filedata->program_headers;
        i < filedata->file_header.e_phnum;
        i++, segment++)
@@ -17750,6 +17750,20 @@ decode_aarch64_feature_1_and (unsigned int bitmask)
 }
 
 static void
+decode_compiler_flags_notes (unsigned long bitmask)
+{
+  printf("%#lx [", bitmask);
+
+  printf("%c%ccxx11, ", bitmask & GNU_PROPERTY_USECXX_VALIDATION ? '=' : '~',
+        bitmask & GNU_PROPERTY_USECXX11_ABI ? '+' : '!');
+
+  printf("%c%casan", bitmask & GNU_PROPERTY_SANITIZE_VALIDATION ? '=' : '~',
+        bitmask & GNU_PROPERTY_SANITIZE_ADDRESS ? '+' : '!');
+
+  printf("]");
+}
+
+static void
 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
 {
   unsigned char * ptr = (unsigned char *) pnote->descdata;
@@ -17914,6 +17928,18 @@ print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
                printf (_("<corrupt length: %#x> "), datasz);
              goto next;
 
+           case GNU_PROPERTY_COMPILER_FLAGS:
+             printf ("compilations flags: ");
+             if ((datasz != 4) && (datasz != 8))
+               printf (_("<corrupt length: %#x> "), datasz);
+             else
+               {
+                 unsigned long bitmask_flags;
+                 bitmask_flags = (unsigned long) byte_get (ptr, size);
+                 decode_compiler_flags_notes (bitmask_flags);
+               }
+             goto next;
+
            default:
              break;
            }