# 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.
#
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"
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*"] } {
|| [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"
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.
}
}
-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" \
{{readelf {-Wl} stack-noexec.rd}} \
"stack-noexec.exe"] \
[list "stack size" \
- "-z stack-size=0x123400" \
+ "-z stack-size=0x123400 -z noexecstack" \
"" \
"" \
{stack.s} \
"" \
{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] {
}
# 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*]
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" \
] \
[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" \
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