diff options
Diffstat (limited to 'ld/testsuite/ld-undefined/weak-undef.exp')
-rw-r--r-- | ld/testsuite/ld-undefined/weak-undef.exp | 103 |
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 } } |