elf: Add GNU_PROPERTY_1_NEEDED
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 17 Jun 2021 19:35:18 +0000 (12:35 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 9 Jul 2021 01:11:53 +0000 (18:11 -0700)
Add GNU_PROPERTY_1_NEEDED:

 #define GNU_PROPERTY_1_NEEDED      GNU_PROPERTY_UINT32_OR_LO

to indicate the needed properties by the object file.

Add GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS:

 #define GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS  (1U << 0)

to indicate that the object file requires canonical function pointers and
cannot be used with copy relocation.

binutils/

* readelf.c (decode_1_needed): New.
(print_gnu_property_note): Handle GNU_PROPERTY_1_NEEDED.

include/

* elf/common.h (GNU_PROPERTY_1_NEEDED): New.
(GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS): Likewise.

ld/

* testsuite/ld-elf/property-1_needed-1a.d: New file.
* testsuite/ld-elf/property-1_needed-1.s: Likewise.

binutils/readelf.c
include/elf/common.h
ld/testsuite/ld-elf/property-1_needed-1.s [new file with mode: 0644]
ld/testsuite/ld-elf/property-1_needed-1a.d [new file with mode: 0644]

index 22153394800570fb009b12fccb716fdc37d7b26e..24ff069edf49a406db1256e5266639e1f3a78d2b 100644 (file)
@@ -19332,6 +19332,28 @@ decode_aarch64_feature_1_and (unsigned int bitmask)
     }
 }
 
+static void
+decode_1_needed (unsigned int bitmask)
+{
+  while (bitmask)
+    {
+      unsigned int bit = bitmask & (- bitmask);
+
+      bitmask &= ~ bit;
+      switch (bit)
+       {
+       case GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS:
+         printf ("indirect external access");
+         break;
+       default:
+         printf (_("<unknown: %x>"), bit);
+         break;
+       }
+      if (bitmask)
+       printf (", ");
+    }
+}
+
 static void
 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
 {
@@ -19525,6 +19547,23 @@ print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
                  || (type >= GNU_PROPERTY_UINT32_OR_LO
                      && type <= GNU_PROPERTY_UINT32_OR_HI))
                {
+                 switch (type)
+                   {
+                   case GNU_PROPERTY_1_NEEDED:
+                     if (datasz != 4)
+                       printf (_("1_needed: <corrupt length: %#x> "),
+                               datasz);
+                     else
+                       {
+                         unsigned int bitmask = byte_get (ptr, 4);
+                         printf ("1_needed: ");
+                         decode_1_needed (bitmask);
+                       }
+                     goto next;
+
+                   default:
+                     break;
+                   }
                  if (type <= GNU_PROPERTY_UINT32_AND_HI)
                    printf (_("UINT32_AND (%#x): "), type);
                  else
index 0cca28673dd63afd1c3eb821b1810fb3f2186e0a..0d381f0d27be5b818a79dfea8293a0bc9a62012a 100644 (file)
 #define GNU_PROPERTY_UINT32_OR_LO      0xb0008000
 #define GNU_PROPERTY_UINT32_OR_HI      0xb000ffff
 
+/* The needed properties by the object file.  */
+#define GNU_PROPERTY_1_NEEDED          GNU_PROPERTY_UINT32_OR_LO
+
+/* Set if the object file requires canonical function pointers and
+   cannot be used with copy relocation.  */
+#define GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS   (1U << 0)
+
 /* Processor-specific semantics, lo */
 #define GNU_PROPERTY_LOPROC  0xc0000000
 /* Processor-specific semantics, hi */
diff --git a/ld/testsuite/ld-elf/property-1_needed-1.s b/ld/testsuite/ld-elf/property-1_needed-1.s
new file mode 100644 (file)
index 0000000..5d5cdc8
--- /dev/null
@@ -0,0 +1,15 @@
+       .section ".note.gnu.property", "a"
+       .p2align ALIGN
+       .long 1f - 0f           /* name length */
+       .long 5f - 2f           /* data length */
+       .long 5                 /* note type */
+0:     .asciz "GNU"            /* vendor name */
+1:
+       .p2align ALIGN
+2:     .long 0xb0008000        /* pr_type.  */
+       .long 4f - 3f           /* pr_datasz.  */
+3:
+       .long 0x3
+4:
+       .p2align ALIGN
+5:
diff --git a/ld/testsuite/ld-elf/property-1_needed-1a.d b/ld/testsuite/ld-elf/property-1_needed-1a.d
new file mode 100644 (file)
index 0000000..d994e6e
--- /dev/null
@@ -0,0 +1,17 @@
+#source: empty.s
+#source: property-1_needed-1.s
+#as:
+#ld: -shared
+#readelf: -n
+#xfail: ![check_shared_lib_support]
+#notarget: am33_2.0-*-* hppa*-*-hpux* mn10300-*-*
+# Assembly source file for the HPPA assembler is renamed and modifed by
+# sed.  mn10300 has relocations in .note.gnu.property section which
+# elf_parse_notes doesn't support.
+
+#...
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: 1_needed: indirect external access, <unknown: 2>
+#pass