]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - ld/testsuite/ld-elf/elf.exp
For test for PR 29072 when the linker is configured with --enable-default-execstack=no.
[thirdparty/binutils-gdb.git] / ld / testsuite / ld-elf / elf.exp
index e98bffc0c5f3669b874f237d20b17707e787ce43..ca345e865c220f209f0e45a37da9862a41220157 100644 (file)
@@ -1,5 +1,5 @@
 # Expect script for various ELF tests.
-#   Copyright (C) 2002-2021 Free Software Foundation, Inc.
+#   Copyright (C) 2002-2023 Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
 #
@@ -99,7 +99,6 @@ if [is_elf64 tmpdir/symbol3w.a] {
         || [istarget h8300-*-*]
         || [istarget ip2k-*-*]
         || [istarget m68hc11-*]
-        || [istarget "xc16x-*"]
         || [istarget "z80-*-*"] } {
        set pr25490_2_exp "pr25490-2-16.rd"
        set pr25490_3_exp "pr25490-3-16.rd"
@@ -180,9 +179,41 @@ if { [check_gc_sections_available] && ![istarget "v850-*-*"] } {
     }
 }
 
-if { [istarget *-*-*linux*]
-     || [istarget *-*-nacl*]
-     || [istarget *-*-gnu*] } {
+proc target_defaults_to_execstack {} {
+    global base_dir
+
+    # If the linker has been configured with --enable-default-execstack=no then
+    # this proc should always return 0.
+    if { [file exists $base_dir/config.status] } {
+       set status [remote_exec host grep "enable-default-execstack=no" $base_dir/config.status]
+       if { [lindex $status 0] == 0 } {
+           return 0
+       } else {
+           verbose -log "$base_dir/config.status does not contain enable-default-execstack=no"
+       }
+    } else {
+       verbose -log "there is no file $base_dir/config.status"
+    }
+    
+    if {   [istarget "aarch64*-*-*"]
+       || [istarget "arc*-*-*"]
+       || [istarget "cris*-*-*"]
+       || [istarget "ia64*-*-*"]
+       || [istarget "loongarch*-*-*"]
+       || [istarget "nios2*-*-*"]
+       || [istarget "powerpc64*-*-*"]
+       || [istarget "pru*-*-*"]
+       || [istarget "riscv*-*-*"]
+       || [istarget "tilegx*-*-*"]
+       || [istarget "tilepro*-*-*"] } {
+         return 0
+    }
+    return 1
+}
+
+if {   [istarget *-*-*linux*]
+    || [istarget *-*-nacl*]
+    || [istarget *-*-gnu*] } {
     run_ld_link_tests [list \
        [list "stack exec" \
            "-z execstack" \
@@ -199,7 +230,7 @@ if { [istarget *-*-*linux*]
            {{readelf {-Wl} stack-noexec.rd}} \
            "stack-noexec.exe"] \
        [list "stack size" \
-           "-z stack-size=0x123400" \
+           "-z stack-size=0x123400 -z noexecstack" \
            "" \
            "" \
            {stack.s} \
@@ -211,8 +242,97 @@ if { [istarget *-*-*linux*]
            "" \
            {pr23900-1.s} \
            [list [list "readelf" {-Wl} $pr23900_1_exp]] \
-           "pr23900-1.exe"] \
+            "pr23900-1.exe"] \
+         ]
+
+    # Test the linker's generation of execstack and executable segment warnings.
+    # Since these are normally pruned from the linker's output we temporarily
+    # disable tha action here.
+    rename prune_warnings_extra old_prune_warnings_extra
+    proc prune_warnings_extra { text } {
+       return $text
+    }
+
+    set curr_ldflags $LDFLAGS
+    if { [istarget powerpc*-*-*] && ![istarget powerpc64*-*-*] } {
+       # Don't generate an executable .plt section
+       set LDFLAGS "$LDFLAGS --secure-plt"
+    }
+
+    # Since the warnings can be disabled by configure, ensure consistency
+    # of the first test by forcing the flags.
+    run_ld_link_tests [list \
+       [list "PR ld/29072 (warn about an executable .note.GNU-stack)" \
+           "-e 0 --warn-execstack --warn-rwx-segments" \
+           "" \
+           "" \
+           {pr29072-a.s} \
+           {{ld pr29072.a.warn}} \
+           "pr29072-a.exe"] \
+       [list "PR 29072 (warn about -z execstack)" \
+           "-z execstack --warn-execstack" \
+           "" \
+           "" \
+           {stack.s} \
+            {{ld pr29072.c.warn}} \
+           "pr29072-c.exe"] \
+       [list "PR ld/29072 (suppress warnings about executable stack)" \
+           "-e 0 --no-warn-execstack" \
+           "" \
+           "" \
+           {pr29072-a.s} \
+           {} \
+           "pr29072-d.exe"] \
+       [list "Ensure that a warning issued when creating a segment with RWX permissions" \
+           "-e 0 -Tnobits-1.t --warn-rwx-segments" \
+           "" \
+           "" \
+           {nobits-1.s} \
+            {{ld rwx-segments-1.l}} \
+           "rwx-segments-1.exe"] \
+       [list "Ensure that a warning issued when creating a TLS segment with execute permission" \
+           "-e 0 -T rwx-segments-2.t --warn-rwx-segments" \
+           "" \
+           "" \
+           {size-2.s} \
+            {{ld rwx-segments-2.l}} \
+           "rwx-segments-2.exe"] \
+       [list "Ensure that the RWX warning can be suppressed" \
+           "-e 0 -Tnobits-1.t --no-warn-rwx-segments" \
+           "" \
+           "" \
+           {nobits-1.s} \
+            {} \
+           "rwx-segments-3.exe"] \
+         ]
+
+    set LDFLAGS $curr_ldflags
+
+    if { [target_defaults_to_execstack] } {
+       run_ld_link_tests [list \
+          [list "PR ld/29072 (warn about absent .note.GNU-stack)" \
+           "-e 0 -z stack-size=0x123400  --warn-execstack" \
+           "" \
+           "" \
+           {pr29072-b.s} \
+           {{ld pr29072.b.warn}} \
+           "pr29072-b.exe"] \
+       ]
+    } else {
+       run_ld_link_tests [list \
+          [list "PR ld/29072 (ignore absent .note.GNU-stack)" \
+           "-e 0 -z stack-size=0x123400" \
+           "" \
+           "" \
+           {pr29072-b.s} \
+           {} \
+           "pr29072-b.exe"] \
        ]
+    }
+
+    # Restore the normal pruning behaviour.
+    rename prune_warnings_extra ""
+    rename old_prune_warnings_extra prune_warnings_extra
 }
 
 if [check_gc_sections_available] {
@@ -304,7 +424,7 @@ set array_tests_static {
 }
 
 # NetBSD ELF systems do not currently support the .*_array sections.
-set xfails "*-*-netbsdelf*"
+set xfails "*-*-netbsd*"
 run_ld_link_exec_tests $array_tests $xfails
 
 if { [istarget *-*-linux*]
@@ -365,7 +485,7 @@ if { [istarget *-*-linux*]
     run_ld_link_exec_tests [list \
        [list \
            "Run mbind2a" \
-           "$NOPIE_LDFLAGS -Wl,-z,common-page-size=0x4000" \
+           "$NOPIE_LDFLAGS -Wl,-z,common-page-size=0x4000 -Wl,-z,noexecstack" \
            "" \
            { mbind2a.s mbind2b.c } \
            "mbind2a" \
@@ -374,7 +494,7 @@ if { [istarget *-*-linux*]
        ] \
        [list \
            "Run mbind2b" \
-           "-static -Wl,-z,common-page-size=0x4000" \
+           "-static -Wl,-z,common-page-size=0x4000 -Wl,-z,noexecstack" \
            "" \
            { mbind2a.s mbind2b.c } \
            "mbind2b" \
@@ -419,31 +539,24 @@ run_cc_link_tests [list \
        {{nm "" pr26391.nd}} \
        "pr26391-4" \
     ] \
-]
-
-run_ld_link_tests [list \
     [list \
        "Build pr26391-5.o" \
-       "-z unique-symbol -r" \
-       "" \
-       "" \
+       "-Wl,-z,unique-symbol -r -nostdlib -nostartfiles" \
+       "-fno-function-sections" \
        {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \
        [list \
            [list "nm" "$dep_plug_opt" "pr26391.nd"] \
            [list "nm" "$dep_plug_opt" "pr26391.fd"] \
        ] \
        "pr26391-5.o" \
-       "-fno-function-sections" \
     ] \
     [list \
        "Build pr26391-6.o" \
-       "-z unique-symbol -r" \
-       "" \
-       "" \
+       "-Wl,-z,unique-symbol -r -nostdlib -nostartfiles" \
+       "-ffunction-sections" \
        {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \
        {{nm "" pr26391.nd}} \
        "pr26391-6.o" \
-       "-ffunction-sections" \
     ] \
 ]
 
@@ -510,4 +623,10 @@ run_ld_link_exec_tests [list \
     ] \
 ]
 
+set merge_exec_tests {
+    {"merge4" "" ""
+       {merge4a.c merge4b.s} "merge4" "merge4.out"}
+}
+run_ld_link_exec_tests $merge_exec_tests
+
 catch "exec rm -f tmpdir/preinit tmpdir/init tmpdir/fini tmpdir/init-mixed" status