aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-undefined/weak-undef.exp
diff options
context:
space:
mode:
Diffstat (limited to 'ld/testsuite/ld-undefined/weak-undef.exp')
-rw-r--r--ld/testsuite/ld-undefined/weak-undef.exp103
1 files changed, 75 insertions, 28 deletions
diff --git a/ld/testsuite/ld-undefined/weak-undef.exp b/ld/testsuite/ld-undefined/weak-undef.exp
index eb28c2c..4ae22cf 100644
--- a/ld/testsuite/ld-undefined/weak-undef.exp
+++ b/ld/testsuite/ld-undefined/weak-undef.exp
@@ -53,6 +53,52 @@ if { ![is_elf_format] && ![is_pecoff_format] } then {
}
}
+proc undef_weak_so { testname opts passval } {
+ global ld
+ global nm
+
+ if {![ld_link $ld tmpdir/weak-fundef.so \
+ "$opts tmpdir/weak-fundef.o"]} then {
+ fail $testname
+ } elseif {![is_remote host] && [which $nm] == 0} then {
+ unresolved $testname
+ } else {
+ set exec_output [run_host_cmd "$nm" "-D tmpdir/weak-fundef.so"]
+ set exec_output [prune_warnings $exec_output]
+
+ set output_regexp ".*w undef_weak_fun.*"
+ if {[regexp $output_regexp $exec_output] == $passval} then {
+ pass $testname
+ } else {
+ fail $testname
+ }
+ return 1
+ }
+ return 0
+}
+
+proc undef_weak_exe { testname opts passval } {
+ global ld
+ global nm
+
+ if {![ld_link $ld tmpdir/weak-fundef \
+ "$opts tmpdir/weak-fundef.o tmpdir/weak-fundef.so"]} then {
+ fail $testname
+ } elseif {![is_remote host] && [which $nm] == 0} then {
+ unresolved $testname
+ } else {
+ set exec_output [run_host_cmd "$nm" "-D tmpdir/weak-fundef"]
+ set exec_output [prune_warnings $exec_output]
+
+ set output_regexp ".*w undef_weak_fun.*"
+ if {[regexp $output_regexp $exec_output] == $passval} then {
+ pass $testname
+ } else {
+ fail $testname
+ }
+ }
+}
+
# When linking a shared lib, weak undefined symbols should become dynamic.
set testname "weak undefined function symbols in shared lib"
@@ -71,39 +117,40 @@ if { $asflags == "" || ![is_elf_format] || ![check_shared_lib_support]} then {
} elseif {![ld_assemble $as "$asflags $srcdir/$subdir/weak-fundef.s" \
tmpdir/weak-fundef.o]} then {
fail $testname
-} elseif {![ld_link $ld tmpdir/weak-fundef.so \
- "--shared tmpdir/weak-fundef.o"]} then {
- fail $testname
-} elseif {![is_remote host] && [which $nm] == 0} then {
- unresolved $testname
-} else {
- set exec_output [run_host_cmd "$nm" "-D tmpdir/weak-fundef.so"]
- set exec_output [prune_warnings $exec_output]
- verbose -log $exec_output
+} elseif { [undef_weak_so $testname "--shared" 1] } then {
- set output_regexp ".*w undef_weak_fun.*"
+ # When linking a dynamic executable, weak undefined symbols become dynamic.
+ set testname "weak undefined function symbols in dynamic exe"
+ undef_weak_exe $testname "--no-as-needed" 1
- if {[regexp $output_regexp $exec_output]} then {
- pass $testname
- } else {
- fail $testname
+ # Find -z options supported by the default emulation
+ set emul [get_target_emul]
+ set cmd [list "$ld --help 2>&1 | sed -e '1,/^$emul:/d;/^\[^ \]*:/,\$d'"]
+ set status [remote_exec host [concat sh -c $cmd]]
+ if { [lindex $status 0] != 0 } {
+ verbose -log "$cmd exited with status [lindex $status 0]"
}
+ set emulopt [lindex $status 1]
- # When linking a dynamic executable, weak undefined symbols become dynamic.
- set testname "weak undefined function symbols in dynamic exe"
+ if { [string first "dynamic-undefined-weak" $emulopt] >= 0 } {
+ # -z dynamic-undefined-weak is supported. Let's see if it works.
- if {![ld_link $ld tmpdir/weak-fundef \
- "--no-as-needed tmpdir/weak-fundef.o tmpdir/weak-fundef.so"]} then {
- fail $testname
- } else {
- set exec_output [run_host_cmd "$nm" "-D tmpdir/weak-fundef"]
- set exec_output [prune_warnings $exec_output]
- verbose -log $exec_output
+ set testname "weak undefined functions in shared lib, no dyn undef weak"
+ undef_weak_so $testname "--shared -z nodynamic-undefined-weak" 0
- if {[regexp $output_regexp $exec_output]} then {
- pass $testname
- } else {
- fail $testname
- }
+ set testname "weak undefined functions in shared lib, dyn undef weak"
+ undef_weak_so $testname "--shared -z dynamic-undefined-weak" 1
+
+ set testname "weak undefined functions in dynamic exe, no dyn undef weak"
+ undef_weak_exe $testname "-z nodynamic-undefined-weak" 0
+
+ set testname "weak undefined functions in dynamic exe, dyn undef weak"
+ undef_weak_exe $testname "-z dynamic-undefined-weak" 1
+
+ set testname "weak undefined functions in pie, no dyn undef weak"
+ undef_weak_exe $testname "-pie -z nodynamic-undefined-weak" 0
+
+ set testname "weak undefined functions in pie, dyn undef weak"
+ undef_weak_exe $testname "-pie -z dynamic-undefined-weak" 1
}
}