]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
ld: Don't explicitly add .note.gnu.build-id in elf.sc
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 22 Sep 2024 00:23:08 +0000 (08:23 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 27 Sep 2024 22:34:39 +0000 (06:34 +0800)
The commit:

e8e10743f7b Add --rosegment option to BFD linker to stop the '-z separate-code' from generating two read-only segments.

places .note.gnu.property and text sections in the same PT_LOAD segment
when --rosegment and -z separate-code are used together.  After

commit f3e660db14a0a95f3953496d8beb7c58ef34c6d5
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Mon Oct 8 04:39:09 2018 -0700

    ELF: Properly group and place orphan note sections

    Properly group orphan note sections.  When placing orphan note section
    as the first note section, place it after the section before all note
    sections.

ld properly groups and places orphan note sections.  If .note.gnu.build-id
is added to elf.sc, the orphan .note.gnu.property section will be placed
before the .note.gnu.build-id section due to the larger section alignment
and may be placed in the same PT_LOAD segment with text sections.  Remove
.note.gnu.build-id from elf.sc to let ld properly group and add all orphan
note sections.

Binutils 2.44 has been fixed by a different fix:

commit 052940eba6fcd2b9f359f03ee205e9cd4dfb1575
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Fri Sep 20 11:32:26 2024 +0800

    ld: Ignore .note.gnu.build-id when placing orphaned notes

since .note.gnu.build-id has been removed from emit_early_ro in elf.sc.

PR ld/32191
* scripttempl/elf.sc (emit_early_ro): Remove .note.gnu.build-id.
* testsuite/ld-i386/i386.exp: Run PR ld/32191 test.
* testsuite/ld-i386/pr32191.d: New file.
* testsuite/ld-x86-64/pr32191-x32.d: New file.
* testsuite/ld-x86-64/pr32191.d: Likewise.
* testsuite/ld-x86-64/pr32191.s: Likewise.
* testsuite/ld-x86-64/x86-64.exp: Run PR ld/32191 tests.

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

index 54716110b61e2dbab9c36dd3885f8bf52a3f6dce..3fdbff520946e2261a89ec224ec135e8e03cb458 100644 (file)
@@ -425,7 +425,6 @@ emit_early_ro()
 {
   cat <<EOF
   ${INITIAL_READONLY_SECTIONS}
-  .note.gnu.build-id ${RELOCATING-0}: { *(.note.gnu.build-id) }
 EOF
 }
 
index 8dafb6261fbd8e9d62f03f52ae7ae400855bbdde..7a8a7e438a1ba26435a239cb616e2aca845d36b5 100644 (file)
@@ -513,6 +513,7 @@ run_dump_test "pr28870"
 run_dump_test "pr28894"
 run_dump_test "pr30787"
 run_dump_test "pr31047"
+run_dump_test "pr32191"
 
 if { !([istarget "i?86-*-linux*"]
        || [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/pr32191.d b/ld/testsuite/ld-i386/pr32191.d
new file mode 100644 (file)
index 0000000..d4a00bb
--- /dev/null
@@ -0,0 +1,9 @@
+#source: ../ld-x86-64/pr32191.s
+#as: --32 -mx86-used-note=yes
+#ld: -shared -m elf_i386 -z separate-code --build-id --rosegment
+#readelf: -lW
+
+#...
+ +[0-9]+ +\.text 
+ +[0-9]+ +\..* \.note\.gnu\.property \.note\.gnu\.build-id .*
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr32191-x32.d b/ld/testsuite/ld-x86-64/pr32191-x32.d
new file mode 100644 (file)
index 0000000..13f38a2
--- /dev/null
@@ -0,0 +1,9 @@
+#source: pr32191.s
+#as: --x32 -mx86-used-note=yes
+#ld: -shared -m elf32_x86_64 -z separate-code --build-id --rosegment
+#readelf: -lW
+
+#...
+ +[0-9]+ +\.text 
+ +[0-9]+ +\..* \.note\.gnu\.property \.note\.gnu\.build-id .*
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr32191.d b/ld/testsuite/ld-x86-64/pr32191.d
new file mode 100644 (file)
index 0000000..7f37f75
--- /dev/null
@@ -0,0 +1,9 @@
+#source: pr32191.s
+#as: --64 -mx86-used-note=yes
+#ld: -shared -m elf_x86_64 -z separate-code --build-id --rosegment
+#readelf: -lW
+
+#...
+ +[0-9]+ +\.text 
+ +[0-9]+ +\..* \.note\.gnu\.property \.note\.gnu\.build-id .*
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr32191.s b/ld/testsuite/ld-x86-64/pr32191.s
new file mode 100644 (file)
index 0000000..953f0de
--- /dev/null
@@ -0,0 +1,5 @@
+       .text
+       .global foo
+foo:
+       .nops 4
+       .section        .note.GNU-stack,"",@progbits
index 05556e830f31e5ca4b50f31ae2465f1dfabb2818..89ce531a5a9509f5743da73a60164860913d44bf 100644 (file)
@@ -540,6 +540,8 @@ run_dump_test "pr31868c-x32"
 run_dump_test "tlsie5"
 run_dump_test "tlsdesc3"
 run_dump_test "tlsdesc4"
+run_dump_test "pr32191"
+run_dump_test "pr32191-x32"
 
 if { ![skip_sframe_tests] } {
     run_dump_test "sframe-simple-1"