Add undefined weak function tests
* testsuite/ld-undefined/weak-fundef.s: New. * testsuite/ld-undefined/weak-undef.t: Don't specify filename. * testsuite/ld-undefined/weak-undef.exp: Run new tests. Rearrange much of old code. Use is_elf_format to select targets.
This commit is contained in:
parent
585bc974b1
commit
bf174910c8
|
@ -1,3 +1,10 @@
|
||||||
|
2016-08-12 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
|
* testsuite/ld-undefined/weak-fundef.s: New.
|
||||||
|
* testsuite/ld-undefined/weak-undef.t: Don't specify filename.
|
||||||
|
* testsuite/ld-undefined/weak-undef.exp: Run new tests. Rearrange
|
||||||
|
much of old code. Use is_elf_format to select targets.
|
||||||
|
|
||||||
2016-08-11 Alan Modra <amodra@gmail.com>
|
2016-08-11 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
PR ld/20436
|
PR ld/20436
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
.text
|
||||||
|
.weak undef_weak_fun
|
||||||
|
.type undef_weak_fun %function
|
||||||
|
.ifdef BL
|
||||||
|
bl undef_weak_fun
|
||||||
|
nop
|
||||||
|
.endif
|
||||||
|
.ifdef CALLPLT
|
||||||
|
call undef_weak_fun@plt
|
||||||
|
.endif
|
||||||
|
.ifdef HPPA
|
||||||
|
bl undef_weak_fun,%r2
|
||||||
|
nop
|
||||||
|
.endif
|
|
@ -18,61 +18,85 @@
|
||||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||||
# MA 02110-1301, USA.
|
# MA 02110-1301, USA.
|
||||||
|
|
||||||
set testname "weak undefined symbols"
|
# The linker should accept references to undefined weaks without error,
|
||||||
|
# and resolve them to zero in a static executable. Ought to work for
|
||||||
|
# some a.out targets too.
|
||||||
|
set testname "weak undefined data symbols"
|
||||||
|
|
||||||
# This test only works for ELF targets. It ought to work for some
|
if { ![is_elf_format] && ![is_pecoff_format] } then {
|
||||||
# a.out targets, but it doesn't.
|
|
||||||
|
|
||||||
if { ![istarget *-*-sysv4*] \
|
|
||||||
&& ![istarget *-*-unixware*] \
|
|
||||||
&& ![istarget *-*-elf*] \
|
|
||||||
&& ![istarget *-*-eabi*] \
|
|
||||||
&& ![istarget hppa*64*-*-hpux*] \
|
|
||||||
&& ![istarget *-*-linux*] \
|
|
||||||
&& ![istarget *-*-gnu*] \
|
|
||||||
&& ![istarget *-*-nacl*] \
|
|
||||||
&& ![istarget *-*-irix5*] \
|
|
||||||
&& ![istarget *-*-irix6*] \
|
|
||||||
&& ![is_pecoff_format] \
|
|
||||||
&& ![istarget *-*-solaris2*] } then {
|
|
||||||
unsupported $testname
|
unsupported $testname
|
||||||
return
|
} elseif {![ld_assemble $as $srcdir/$subdir/weak-undef.s \
|
||||||
}
|
tmpdir/weak-undef.o]} then {
|
||||||
|
# It's OK if .weak doesn't work on this target.
|
||||||
if { [istarget *-*-linux*aout*] \
|
unresolved $testname
|
||||||
|| [istarget *-*-linux*oldld*] } {
|
} elseif {![ld_simple_link $ld tmpdir/weak-undef \
|
||||||
unsupported $testname
|
"tmpdir/weak-undef.o -T $srcdir/$subdir/weak-undef.t"]} then {
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
# Weak symbols are broken for non-i386 PE targets.
|
# Weak symbols are broken for non-i386 PE targets.
|
||||||
if {! [istarget i?86-*-*]} {
|
if {! [istarget i?86-*-*]} {
|
||||||
setup_xfail *-*-pe*
|
setup_xfail *-*-pe*
|
||||||
}
|
}
|
||||||
|
|
||||||
setup_xfail pj-*-*
|
setup_xfail pj-*-*
|
||||||
|
fail $testname
|
||||||
if {! [ld_assemble $as $srcdir/$subdir/weak-undef.s tmpdir/weak-undef.o]} then {
|
} elseif {![is_remote host] && [which $objdump] == 0} then {
|
||||||
# It's OK if .weak doesn't work on this target.
|
|
||||||
unresolved $testname
|
unresolved $testname
|
||||||
return
|
} else {
|
||||||
|
set exec_output [run_host_cmd "$objdump" "-s tmpdir/weak-undef"]
|
||||||
|
set exec_output [prune_warnings $exec_output]
|
||||||
|
verbose -log $exec_output
|
||||||
|
|
||||||
|
set output_regexp ".*Contents of section .data:.*0000 00000000 11111111.*"
|
||||||
|
|
||||||
|
if {[regexp $output_regexp $exec_output]} then {
|
||||||
|
pass $testname
|
||||||
|
} else {
|
||||||
|
fail $testname
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# The linker should accept references to undefined weaks without error,
|
# When linking a shared lib, weak undefined symbols should become dynamic.
|
||||||
# and resolve them to zero.
|
set testname "weak undefined function symbols in shared lib"
|
||||||
|
|
||||||
set output_regexp \
|
set asflags ""
|
||||||
".*Contents of section .data:.*0000 00000000 11111111.*"
|
switch -glob $target_triplet {
|
||||||
|
aarch64* -
|
||||||
|
arm* -
|
||||||
|
powerpc* { set asflags "--defsym BL=1" }
|
||||||
|
hppa* { set asflags "--defsym HPPA=1" }
|
||||||
|
i\[3-7\]86* -
|
||||||
|
x86_64* { set asflags "--defsym CALLPLT=1" }
|
||||||
|
}
|
||||||
|
|
||||||
if {! [ld_simple_link $ld tmpdir/weak-undef "$flags tmpdir/weak-undef.o -T $srcdir/$subdir/weak-undef.t"] } then {
|
if { $asflags == "" || ![is_elf_format] || ![check_shared_lib_support]} then {
|
||||||
|
unresolved $testname
|
||||||
|
} elseif {![ld_assemble $as "$asflags $srcdir/$subdir/weak-fundef.s" \
|
||||||
|
tmpdir/weak-fundef.o]} then {
|
||||||
|
fail $testname
|
||||||
|
} elseif {![ld_simple_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
|
||||||
|
|
||||||
|
set output_regexp ".*w undef_weak_fun.*"
|
||||||
|
|
||||||
|
if {[regexp $output_regexp $exec_output]} then {
|
||||||
|
pass $testname
|
||||||
|
} else {
|
||||||
|
fail $testname
|
||||||
|
}
|
||||||
|
|
||||||
|
# When linking a dynamic executable, weak undefined symbols become dynamic.
|
||||||
|
set testname "weak undefined function symbols in dynamic exe"
|
||||||
|
|
||||||
|
if {![ld_simple_link $ld tmpdir/weak-fundef \
|
||||||
|
"--no-as-needed tmpdir/weak-fundef.o tmpdir/weak-fundef.so"]} then {
|
||||||
fail $testname
|
fail $testname
|
||||||
} else {
|
} else {
|
||||||
if {![is_remote host] && [which $objdump] == 0} then {
|
set exec_output [run_host_cmd "$nm" "-D tmpdir/weak-fundef"]
|
||||||
unresolved $testname
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
set exec_output [run_host_cmd "$objdump" "-s tmpdir/weak-undef"]
|
|
||||||
set exec_output [prune_warnings $exec_output]
|
set exec_output [prune_warnings $exec_output]
|
||||||
verbose -log $exec_output
|
verbose -log $exec_output
|
||||||
|
|
||||||
|
@ -82,3 +106,4 @@ if {! [ld_simple_link $ld tmpdir/weak-undef "$flags tmpdir/weak-undef.o -T $srcd
|
||||||
fail $testname
|
fail $testname
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
.data : {
|
.data : {
|
||||||
tmpdir/weak-undef.o(.data)
|
*(.data)
|
||||||
}
|
}
|
||||||
/DISCARD/ : {
|
/DISCARD/ : {
|
||||||
*(*)
|
*(*)
|
||||||
|
|
Loading…
Reference in New Issue