]> 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 3ae769e3bf9d133f59f612c4f59431851c420a85..ca345e865c220f209f0e45a37da9862a41220157 100644 (file)
@@ -1,5 +1,5 @@
 # Expect script for various ELF tests.
-#   Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#   Copyright (C) 2002-2023 Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
 #
@@ -25,6 +25,19 @@ if ![is_elf_format] {
     return
 }
 
+# Return true if target is riscv little endian.
+# xfail the riscv little endain targets for the compressed1d1 test;
+# The riscv big endian targets and others should pass.
+proc riscv_little_endian { } {
+    if { [istarget "riscv32-*-*"]
+        || [istarget "riscv64-*-*"]
+        || [istarget "riscv32le-*-*"]
+        || [istarget "riscv64le-*-*"] } {
+       return 1
+    }
+    return 0
+}
+
 set old_ldflags $LDFLAGS
 if { [istarget spu*-*-*] } {
     set LDFLAGS "$LDFLAGS --local-store 0:0"
@@ -46,11 +59,8 @@ if { [istarget alpha*-*-* ] } {
     set ASFLAGS "$ASFLAGS --defsym NO_SET=1"
 }
 
-if { [istarget "*-*-nacl*"] } {
-    # The eh[1-4] cases are written to expect ELFCLASS64 layout on x86-64.
-    # But the target default is ELFCLASS32.  So the cases explicitly use
-    # -melf_x86_64 to select that, but NaCl needs a different emulation name.
-    set options_regsub(ld) {-melf_x86_64 -melf_x86_64_nacl}
+if [istarget "tic6x-*-*"] {
+    append ASFLAGS " -mpic -mpid=near"
 }
 
 if { [istarget "*-*-solaris*"] } {
@@ -89,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"
@@ -126,6 +135,16 @@ if { [istarget "i?86-*-*"] || [istarget "x86_64-*-*"] } {
     set ASFLAGS "$ASFLAGS -mx86-used-note=no"
 }
 
+# Build libraries required for SHF_GNU_RETAIN tests.
+if { [check_gc_sections_available] && [supports_gnu_osabi] } {
+    run_ld_link_tests [list \
+       [list "Build libretain5.a" "" "" "" \
+           {retain5lib.s} {} "libretain5.a"] \
+       [list "Build libretain6.a" "" "" "" \
+           {retain6lib.s} {} "libretain6.a"] \
+       ]
+}
+
 set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
 foreach t $test_list {
     # We need to strip the ".d", but can leave the dirname.
@@ -160,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" \
@@ -179,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} \
@@ -191,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] {
@@ -284,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*]
@@ -345,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" \
@@ -354,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" \
@@ -366,4 +506,127 @@ if { [istarget *-*-linux*]
 
 run_ld_link_exec_tests $array_tests_static $xfails
 
+run_cc_link_tests [list \
+    [list \
+       "Build pr26391-1" \
+       "-Wl,-z,unique-symbol" \
+       "-fno-function-sections" \
+       {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \
+       {{nm "" pr26391.nd}} \
+       "pr26391-1" \
+    ] \
+    [list \
+       "Build pr26391-2" \
+       "-Wl,-z,unique-symbol" \
+       "-ffunction-sections" \
+       {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \
+       {{nm "" pr26391.nd}} \
+       "pr26391-2" \
+    ] \
+    [list \
+       "Build pr26391-3" \
+       "-Wl,-z,unique-symbol,--emit-relocs" \
+       "-fno-function-sections" \
+       {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \
+       {{nm "" pr26391.nd}} \
+       "pr26391-3" \
+    ] \
+    [list \
+       "Build pr26391-4" \
+       "-Wl,-z,unique-symbol,--emit-relocs" \
+       "-ffunction-sections" \
+       {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \
+       {{nm "" pr26391.nd}} \
+       "pr26391-4" \
+    ] \
+    [list \
+       "Build pr26391-5.o" \
+       "-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" \
+    ] \
+    [list \
+       "Build pr26391-6.o" \
+       "-Wl,-z,unique-symbol -r -nostdlib -nostartfiles" \
+       "-ffunction-sections" \
+       {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \
+       {{nm "" pr26391.nd}} \
+       "pr26391-6.o" \
+    ] \
+]
+
+run_ld_link_exec_tests [list \
+    [list \
+       "Run pr26391-1" \
+       "-Wl,-z,unique-symbol" \
+       "" \
+       {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \
+       "pr26391-1" \
+       "pr26391.out" \
+       "-fno-function-sections" \
+    ] \
+    [list \
+       "Run pr26391-2" \
+       "-Wl,-z,unique-symbol" \
+       "" \
+       {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \
+       "pr26391-2" \
+       "pr26391.out" \
+       "-ffunction-sections" \
+    ] \
+    [list \
+       "Run pr26391-3" \
+       "-Wl,-z,unique-symbol,--emit-relocs" \
+       "" \
+       {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \
+       "pr26391-3" \
+       "pr26391.out" \
+       "-fno-function-sections" \
+    ] \
+    [list \
+       "Run pr26391-4" \
+       "-Wl,-z,unique-symbol,--emit-relocs" \
+       "" \
+       {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \
+       "pr26391-4" \
+       "pr26391.out" \
+       "-ffunction-sections" \
+    ] \
+    [list \
+       "Run pr26391-5" \
+       "-Wl,-z,unique-symbol" \
+       "" \
+       {dummy.c} \
+       "pr26391-5" \
+       "pr26391.out" \
+       "" \
+       "c" \
+       "" \
+       "tmpdir/pr26391-5.o" \
+    ] \
+    [list \
+       "Run pr26391-6" \
+       "-Wl,-z,unique-symbol" \
+       "" \
+       {dummy.c} \
+       "pr26391-6" \
+       "pr26391.out" \
+       "" \
+       "c" \
+       "" \
+       "tmpdir/pr26391-6.o" \
+    ] \
+]
+
+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