]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
elf: Prune empty generic properties
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 19 Aug 2025 02:16:00 +0000 (19:16 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 19 Aug 2025 11:10:02 +0000 (04:10 -0700)
Prune empty generic properties before discarding empty property note
section and leave processor specific properties to the backend.

bfd/

PR ld/33292
* elf-properties.c (elf_prune_empty_properties): New function.
(_bfd_elf_link_setup_gnu_properties): Call
elf_prune_empty_properties before discarding empty property note
section.  Move indirect_extern_access processing before
elf_prune_empty_properties call.

ld/

PR ld/33292
* testsuite/ld-x86-64/pr33292-x32.d: New file.
* testsuite/ld-x86-64/pr33292.d: Likewise.
* testsuite/ld-x86-64/pr33292.s: Likewise.
* testsuite/ld-x86-64/x86-64.exp: Run PR ld/33292 tests.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
bfd/elf-properties.c
ld/testsuite/ld-x86-64/pr33292-x32.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr33292.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr33292.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 07ab38098e6ab289343a5374438ea083d13e6aad..73eb231d86148baf89b240b180f3a1d8f1358653 100644 (file)
@@ -697,6 +697,23 @@ _bfd_elf_link_create_gnu_property_sec (struct bfd_link_info *info, bfd *elf_bfd,
   return sec;
 }
 
+/* Prune empty generic properties.  */
+
+static void
+elf_prune_empty_properties (elf_property_list **pp)
+{
+  elf_property_list *p;
+
+  while ((p = *pp) != NULL)
+    if ((p->property.pr_type < GNU_PROPERTY_LOPROC
+        || p->property.pr_type >= GNU_PROPERTY_LOUSER)
+       && p->property.pr_datasz != 0
+       && p->property.pr_kind == property_number
+       && p->property.u.number == 0)
+      *pp = p->next;
+    else
+      pp = &p->next;
+}
 
 /* Set up GNU properties.  Return the first relocatable ELF input with
    GNU properties if found.  Otherwise, return NULL.  */
@@ -878,22 +895,6 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
       if (bed->fixup_gnu_properties)
        bed->fixup_gnu_properties (info, &elf_properties (first_pbfd));
 
-      if (elf_properties (first_pbfd) == NULL)
-       {
-         /* Discard .note.gnu.property section if all properties have
-            been removed.  */
-         sec->output_section = bfd_abs_section_ptr;
-         return NULL;
-       }
-
-      /* Compute the section size.  */
-      list = elf_properties (first_pbfd);
-      size = elf_get_gnu_property_section_size (list, align_size);
-
-      /* Update .note.gnu.property section now.  */
-      sec->size = size;
-      contents = (bfd_byte *) bfd_zalloc (first_pbfd, size);
-
       if (info->indirect_extern_access <= 0)
        {
          /* Get GNU_PROPERTY_1_NEEDED properties.  */
@@ -917,6 +918,24 @@ _bfd_elf_link_setup_gnu_properties (struct bfd_link_info *info)
            }
        }
 
+      elf_prune_empty_properties (&elf_properties (first_pbfd));
+
+      if (elf_properties (first_pbfd) == NULL)
+       {
+         /* Discard .note.gnu.property section if all properties have
+            been removed.  */
+         sec->output_section = bfd_abs_section_ptr;
+         return NULL;
+       }
+
+      /* Compute the section size.  */
+      list = elf_properties (first_pbfd);
+      size = elf_get_gnu_property_section_size (list, align_size);
+
+      /* Update .note.gnu.property section now.  */
+      sec->size = size;
+      contents = (bfd_byte *) bfd_zalloc (first_pbfd, size);
+
       elf_write_gnu_properties (info, first_pbfd, contents, list, size,
                                align_size);
 
diff --git a/ld/testsuite/ld-x86-64/pr33292-x32.d b/ld/testsuite/ld-x86-64/pr33292-x32.d
new file mode 100644 (file)
index 0000000..0d6cf81
--- /dev/null
@@ -0,0 +1,10 @@
+#source: pr33292.s
+#as: --x32 -mx86-used-note=yes
+#ld: -shared -m elf32_x86_64 -z noindirect-extern-access
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature used: x86
+       x86 ISA used: x86-64-baseline
diff --git a/ld/testsuite/ld-x86-64/pr33292.d b/ld/testsuite/ld-x86-64/pr33292.d
new file mode 100644 (file)
index 0000000..456b849
--- /dev/null
@@ -0,0 +1,9 @@
+#as: --64 -defsym __64_bit__=1 -mx86-used-note=yes
+#ld: -shared -m elf_x86_64 -z noindirect-extern-access
+#readelf: -n
+
+Displaying notes found in: .note.gnu.property
+[      ]+Owner[        ]+Data size[    ]+Description
+  GNU                  0x[0-9a-f]+     NT_GNU_PROPERTY_TYPE_0
+      Properties: x86 feature used: x86
+       x86 ISA used: x86-64-baseline
diff --git a/ld/testsuite/ld-x86-64/pr33292.s b/ld/testsuite/ld-x86-64/pr33292.s
new file mode 100644 (file)
index 0000000..8d14e88
--- /dev/null
@@ -0,0 +1,34 @@
+       .section ".note.gnu.property", "a"
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+       .long 1f - 0f           /* name length */
+       .long 5f - 2f           /* data length */
+       .long 5                 /* note type */
+0:     .asciz "GNU"            /* vendor name */
+1:
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+2:     .long 0xb0008000        /* pr_type.  */
+       .long 4f - 3f           /* pr_datasz.  */
+3:
+       .long 0x1
+4:
+.ifdef __64_bit__
+       .p2align 3
+.else
+       .p2align 2
+.endif
+5:
+
+       .text
+       .globl  foo
+       .type   foo, @function
+foo:
+       ret
+       .section        .note.GNU-stack
index 6b86bc3d018a28a683de22b73e6d9815cf3ec125..a72a7da12c1b977f6495918b0be72625fd4d8f7f 100644 (file)
@@ -568,6 +568,8 @@ run_dump_test "pr33260"
 run_dump_test "pr33260-x32"
 run_dump_test "pr33260-2"
 run_dump_test "pr33260-2-x32"
+run_dump_test "pr33292"
+run_dump_test "pr33292-x32"
 
 if { ![skip_sframe_tests] } {
     run_dump_test "sframe-simple-1"