commit: f96ad7995e3833535278b5edcc9cbfa636eca2ac Author: Sam James <sam <AT> gentoo <DOT> org> AuthorDate: Tue Aug 19 03:47:53 2025 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Tue Aug 19 03:47:53 2025 +0000 URL: https://gitweb.gentoo.org/proj/toolchain/binutils-patches.git/commit/?id=f96ad799
9999: add fix for property pruning Signed-off-by: Sam James <sam <AT> gentoo.org> 9999/0010-elf-Prune-empty-generic-properties.patch | 204 +++++++++++++++++++++ 1 file changed, 204 insertions(+) diff --git a/9999/0010-elf-Prune-empty-generic-properties.patch b/9999/0010-elf-Prune-empty-generic-properties.patch new file mode 100644 index 0000000..598781d --- /dev/null +++ b/9999/0010-elf-Prune-empty-generic-properties.patch @@ -0,0 +1,204 @@ +From 5179e6a3d41c8e5df76065f24f5eec32e93b4584 Mon Sep 17 00:00:00 2001 +Message-ID: <5179e6a3d41c8e5df76065f24f5eec32e93b4584.1755575227.git....@gentoo.org> +From: "H.J. Lu" <[email protected]> +Date: Mon, 18 Aug 2025 18:37:00 -0700 +Subject: [PATCH] elf: Prune empty generic properties + +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 <[email protected]> +--- + bfd/elf-properties.c | 51 +++++++++++++++++++--------- + ld/testsuite/ld-x86-64/pr33292-x32.d | 10 ++++++ + ld/testsuite/ld-x86-64/pr33292.d | 9 +++++ + ld/testsuite/ld-x86-64/pr33292.s | 34 +++++++++++++++++++ + ld/testsuite/ld-x86-64/x86-64.exp | 2 ++ + 5 files changed, 90 insertions(+), 16 deletions(-) + create mode 100644 ld/testsuite/ld-x86-64/pr33292-x32.d + create mode 100644 ld/testsuite/ld-x86-64/pr33292.d + create mode 100644 ld/testsuite/ld-x86-64/pr33292.s + +diff --git a/bfd/elf-properties.c b/bfd/elf-properties.c +index 07ab38098e6..73eb231d861 100644 +--- a/bfd/elf-properties.c ++++ b/bfd/elf-properties.c +@@ -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 +index 00000000000..0d6cf8115cd +--- /dev/null ++++ b/ld/testsuite/ld-x86-64/pr33292-x32.d +@@ -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 +index 00000000000..456b8499b57 +--- /dev/null ++++ b/ld/testsuite/ld-x86-64/pr33292.d +@@ -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 +index 00000000000..8d14e880712 +--- /dev/null ++++ b/ld/testsuite/ld-x86-64/pr33292.s +@@ -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 +diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp +index 0c66d1b26f7..9d975319cf5 100644 +--- a/ld/testsuite/ld-x86-64/x86-64.exp ++++ b/ld/testsuite/ld-x86-64/x86-64.exp +@@ -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" + +base-commit: 7e432e93f8aaa14368476cf5eae9d55c18a266fb +prerequisite-patch-id: f9e52c2b633aadd966330c2c4529c890981bac7e +-- +2.51.0 +
