]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
ld: Pass --no-rosegment to ld in some linker tests
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 18 Mar 2026 20:58:35 +0000 (13:58 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 3 Apr 2026 08:25:25 +0000 (16:25 +0800)
For elf/x86, --rosegment places code after read-only data, instead of
before read-only data.  Pass --no-rosegment to ld in some linker tests
to avoid extra linker test failures when binutils is configured with
--enable-rosegment for elf/x86.

binutils/

PR ld/34003
* testsuite/lib/binutils-common.exp (check_rosegment_support): New.
(run_dump_test): Make NO_ROSEGMENT_LDFLAGS global.

ld/

PR ld/34003
* testsuite/config/default.exp (NO_ROSEGMENT_LDFLAGS): New.
* testsuite/ld-elf/mbind1a.d: Pass $NO_ROSEGMENT_LDFLAGS to ld.
* testsuite/ld-elf/pr26256-2b.d: Likewise.
* testsuite/ld-srec/srec.exp (extra_flags): Add
$NO_ROSEGMENT_LDFLAGS.
* testsuite/ld-x86-64/no-plt.exp: Pass -Wl,--no-rosegment to
compiler.
* testsuite/ld-x86-64/pr27491-1c.d: Pass --no-rosegment to ld.
* testsuite/ld-x86-64/pr27491-2.d: Likewise.
* testsuite/ld-x86-64/pr27491-3.d: Likewise.
* testsuite/ld-x86-64/pr27491-4.d: Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
binutils/testsuite/lib/binutils-common.exp
ld/testsuite/config/default.exp
ld/testsuite/ld-elf/mbind1a.d
ld/testsuite/ld-elf/pr26256-2b.d
ld/testsuite/ld-srec/srec.exp
ld/testsuite/ld-x86-64/no-plt.exp
ld/testsuite/ld-x86-64/pr27491-1c.d
ld/testsuite/ld-x86-64/pr27491-2.d
ld/testsuite/ld-x86-64/pr27491-3.d
ld/testsuite/ld-x86-64/pr27491-4.d

index 8683202a3ccfe697bb9a25b575cc6960df0ec3ee..34bc3a5af643fdc0289ab4159688d0dea2dd4e93 100644 (file)
@@ -430,6 +430,23 @@ proc check_memory_seal_support { } {
     return $memory_seal_available_saved
 }
 
+proc check_rosegment_support { } {
+    global rosegment_available_saved
+    global ld
+
+    if {![info exists rosegment_available_saved]} {
+       set ld_output [remote_exec host $ld "--no-rosegment"]
+       if { [string first "not supported" $ld_output] >= 0
+            || [string first "unrecognized option" $ld_output] >= 0
+            || [string first "--no-rosegment ignored" $ld_output] >= 0 } {
+           set rosegment_available_saved 0
+       } else {
+           set rosegment_available_saved 1
+       }
+    }
+    return $rosegment_available_saved
+}
+
 # Check for support of the .noinit section, used for data that is not
 # initialized at load, or during the application's initialization sequence.
 proc supports_noinit_section {} {
@@ -1042,6 +1059,7 @@ proc run_dump_test { name {extra_options {}} } {
     global SIZE SIZEFLAGS
     global copyfile env runtests srcdir subdir verbose base_dir
     global DT_RELR_LDFLAGS NO_DT_RELR_LDFLAGS
+    global NO_ROSEGMENT_LDFLAGS
 
     if [string match "*/*" $name] {
        set file $name
index 8a67721fa4e811faa6c0d6ede49f61c20870f006..2796f719f225cc9dd2e6aa2fd823bfb46ff6698c 100644 (file)
@@ -399,6 +399,14 @@ if { ![info exists NO_MEMORY_SEAL_LDFLAGS] } then {
     }
 }
 
+if { ![info exists NO_ROSEGMENT_LDFLAGS] } then {
+    if { [check_rosegment_support] } then {
+       set NO_ROSEGMENT_LDFLAGS "--no-rosegment"
+    } else {
+       set NO_ROSEGMENT_LDFLAGS {}
+    }
+}
+
 # Set LD_CLASS to "64bit" for a 64-bit *host* linker.
 if { ![info exists LD_CLASS] } then {
     set REAL_LD [findfile $base_dir/.libs/ld-new .libs/ld-new $LD [transform ld]]
index 0e9f900c86831624bc7c3adca1dd00126ea26d1c..310160063f0155ac2a4b83cf8420be58bae8a866 100644 (file)
@@ -1,5 +1,5 @@
 #source: mbind1.s
-#ld: -z common-page-size=0x1000 -z max-page-size=0x200000
+#ld: -z common-page-size=0x1000 -z max-page-size=0x200000 $NO_ROSEGMENT_LDFLAGS
 #readelf: -S -l --wide
 #target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi
 
index 3f8c37e267b0c3f59d65823305f87929e15710e6..aa797dcc1a4e5b42d446075b07e78fee4a280d83 100644 (file)
@@ -1,5 +1,5 @@
 #source: pr26256-2.s
-#ld: -e _start
+#ld: -e _start $NO_ROSEGMENT_LDFLAGS
 #nm: -n
 #notarget: fr30-*-* iq2000-*-* ip2k-*-* xgate-*-* xstormy16-*-*
 # These targets place .linkorder sections before .text sections.
index 39efcc49852ece22370c26be85943ac3f9425c4f..55959528f5fa47afe9bef50d8e4b9ad7306f93a1 100644 (file)
@@ -348,7 +348,7 @@ set test2 "S-records with constructors"
 # See whether the default linker script uses SIZEOF_HEADERS.
 set exec_output [run_host_cmd "$ld" "--verbose"]
 set sizeof_headers [string match "*SIZEOF_HEADERS*" $exec_output]
-set extra_flags " $NO_MEMORY_SEAL_LDFLAGS"
+set extra_flags " $NO_MEMORY_SEAL_LDFLAGS $NO_ROSEGMENT_LDFLAGS"
 
 # First test linking a C program.  We don't require any libraries.  We
 # link it normally, and objcopy to the S-record format, and then link
index 235bcb8b48d0fa35e1135bff7d46935606765e2a..69e34924064d3ed0463deb79c5ce022aca37a163 100644 (file)
@@ -72,7 +72,7 @@ run_cc_link_tests [list \
     [list \
        "Build no PLT (dynamic 1a)" \
        "$NOPIE_LDFLAGS tmpdir/no-plt-check1.o tmpdir/no-plt-main1.o \
-        tmpdir/no-plt-func1.o tmpdir/no-plt-extern1.o" \
+        -Wl,--no-rosegment tmpdir/no-plt-func1.o tmpdir/no-plt-extern1.o" \
        "-Wa,-mx86-used-note=yes" \
        {dummy.s} \
        {{readelf -Wr no-plt-1a.rd} {objdump -dwrj.text no-plt-1a.dd}} \
@@ -80,7 +80,7 @@ run_cc_link_tests [list \
     ] \
     [list \
        "Build no PLT (dynamic 1b)" \
-       "tmpdir/no-plt-check1.o tmpdir/no-plt-main1.o \
+       "-Wl,--no-rosegment tmpdir/no-plt-check1.o tmpdir/no-plt-main1.o \
         tmpdir/libno-plt-1a.so tmpdir/libno-plt-1b.so" \
        "-Wa,-mx86-used-note=yes" \
        {dummy.s} \
@@ -90,7 +90,7 @@ run_cc_link_tests [list \
     [list \
        "Build no PLT (dynamic 1c)" \
        "$NOPIE_LDFLAGS tmpdir/no-plt-check1.o tmpdir/no-plt-main1.o \
-        tmpdir/no-plt-func1.o tmpdir/libno-plt-1b.so" \
+        -Wl,--no-rosegment tmpdir/no-plt-func1.o tmpdir/libno-plt-1b.so" \
        "-Wa,-mx86-used-note=yes" \
        {dummy.s} \
        {{readelf -Wr no-plt-1c.rd} {objdump -dwrj.text no-plt-1c.dd}} \
@@ -99,7 +99,7 @@ run_cc_link_tests [list \
     [list \
        "Build no PLT (static 1d)" \
        "-static tmpdir/no-plt-check1.o tmpdir/no-plt-main1.o \
-        tmpdir/no-plt-func1.o tmpdir/no-plt-extern1.o" \
+        -Wl,--no-rosegment tmpdir/no-plt-func1.o tmpdir/no-plt-extern1.o" \
        "-Wa,-mx86-used-note=yes" \
        {dummy.s} \
        {{readelf -Wr no-plt-1d.rd} {objdump -dwrj.text no-plt-1d.dd}} \
@@ -108,7 +108,7 @@ run_cc_link_tests [list \
     [list \
        "Build no PLT (PIE 1e)" \
        "-pie tmpdir/no-plt-check1.o tmpdir/no-plt-main1.o \
-        tmpdir/no-plt-func1.o tmpdir/no-plt-extern1.o" \
+        -Wl,--no-rosegment tmpdir/no-plt-func1.o tmpdir/no-plt-extern1.o" \
        "-Wa,-mx86-used-note=yes" \
        {dummy.s} \
        {{readelf -Wr no-plt-1e.rd} {nm -gD no-plt-1e.nd} {objdump -dwrj.text no-plt-1e.dd}} \
@@ -117,7 +117,7 @@ run_cc_link_tests [list \
     [list \
        "Build no PLT (PIE 1f)" \
        "-pie tmpdir/no-plt-check1.o tmpdir/no-plt-main1.o \
-        tmpdir/libno-plt-1a.so tmpdir/libno-plt-1b.so" \
+        -Wl,--no-rosegment tmpdir/libno-plt-1a.so tmpdir/libno-plt-1b.so" \
        "-Wa,-mx86-used-note=yes" \
        { dummy.s } \
        {{readelf -Wr no-plt-1f.rd} {objdump -dwrj.text no-plt-1f.dd}} \
@@ -126,7 +126,7 @@ run_cc_link_tests [list \
     [list \
        "Build no PLT (PIE 1g)" \
        "-pie tmpdir/no-plt-check1.o tmpdir/no-plt-main1.o \
-        tmpdir/no-plt-func1.o tmpdir/libno-plt-1b.so" \
+        -Wl,--no-rosegment tmpdir/no-plt-func1.o tmpdir/libno-plt-1b.so" \
        "-Wa,-mx86-used-note=yes" \
        { dummy.s } \
        {{readelf -Wr no-plt-1g.rd} {objdump -dwrj.text no-plt-1g.dd}} \
index 1288361463d59e003f0b44b1cde1ae14cb7131ec..be74f50c2580ac77d54d5cbb2650a7af682d3a4a 100644 (file)
@@ -1,6 +1,6 @@
 #source: pr27491-1.s
 #as: --64
-#ld: --gc-sections -melf_x86_64 -shared
+#ld: --gc-sections -melf_x86_64 -shared --no-rosegment
 #objdump: --syms -dw
 
 .*: +file format elf64-x86-64
index 753ebb64082f2b8f0c8f23a1e9d4f717429bb076..949c3cece09357fcb29173b1a9f953dd39bf6cee 100644 (file)
@@ -1,5 +1,5 @@
 #as: --64
-#ld: --gc-sections -melf_x86_64 -z start-stop-gc -shared
+#ld: --gc-sections -melf_x86_64 -z start-stop-gc -shared --no-rosegment
 #objdump: --syms -dw
 
 .*: +file format elf64-x86-64
index 6dda5424ffffd6c2926465412fc7a9a175e1cdf4..c7cba38d0a6cef97d092f81ea83b9f16de3dae29 100644 (file)
@@ -1,5 +1,5 @@
 #as: --64
-#ld: --gc-sections -melf_x86_64 -z start-stop-gc -shared
+#ld: --gc-sections -melf_x86_64 -z start-stop-gc -shared --no-rosegment
 #objdump: --syms -dw
 
 .*: +file format elf64-x86-64
index 54542fd2d1a264871bacf166a78b420da337c82b..44d6c2f9af3fc9808ab7f32d4dac43c1d7a4e4c6 100644 (file)
@@ -1,7 +1,7 @@
 #source: pr27491-4a.s
 #source: pr27491-4b.s
 #as: --64
-#ld: --gc-sections -melf_x86_64 -z start-stop-gc -shared
+#ld: --gc-sections -melf_x86_64 -z start-stop-gc -shared --no-rosegment
 #objdump: --syms -dw
 
 .*: +file format elf64-x86-64