2021-01-01 06:58:58 +08:00
|
|
|
# Copyright (C) 2014-2021 Free Software Foundation, Inc.
|
2014-10-15 08:59:41 +08:00
|
|
|
#
|
|
|
|
# This file is part of the GNU Binutils.
|
|
|
|
#
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program; if not, write to the Free Software
|
|
|
|
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
|
|
# MA 02110-1301, USA.
|
|
|
|
|
2021-01-05 20:24:25 +08:00
|
|
|
# Don't run on alpha-vms which requires linking with other libraries,
|
|
|
|
# or on targets that complain about relocations in read-only sections.
|
|
|
|
if { [istarget *-*-vms]
|
|
|
|
|| [istarget bfin-*-*]
|
|
|
|
|| [istarget frv-*-*]
|
|
|
|
|| [istarget lm32-*-*] } then {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2014-10-15 08:59:41 +08:00
|
|
|
# Check that scripts using the "=" sysroot-prefix work, for both
|
|
|
|
# toolchains with and without --sysroot support.
|
|
|
|
|
|
|
|
# We test this by emitting archives into a subdirectory and expect
|
|
|
|
# constructs such as GROUP and AS_NEEDED (the only two constructs
|
|
|
|
# actually tested) to find them (or not); both quoted and unquoted
|
|
|
|
# paths, with different prefixes on the path and with --sysroot
|
|
|
|
# present or not, with different arguments.
|
|
|
|
|
|
|
|
# Find out if the linker supports sysroot; if it was configured
|
2014-10-17 19:10:18 +08:00
|
|
|
# "--with-sysroot X" where X is a non-empty string.
|
2014-10-15 08:59:41 +08:00
|
|
|
set with_sysroot [check_sysroot_available]
|
2014-10-17 19:10:18 +08:00
|
|
|
verbose -log "Has (non-empty) sysroot support: $with_sysroot; \"$ld_sysroot\""
|
|
|
|
|
|
|
|
# We also need to know if the sysroot is "/" (a common use) as some of
|
|
|
|
# the tests prepend sysroot to the current directory and on most
|
|
|
|
# common systems "//dir/path" is handled as "/dir/path".
|
|
|
|
if {$ld_sysroot == "/"} {
|
|
|
|
# Use a modified test-subset for testing.
|
|
|
|
set with_sysroot 3
|
|
|
|
}
|
2014-10-15 08:59:41 +08:00
|
|
|
|
2017-02-15 17:13:56 +08:00
|
|
|
# The linker on Windows expects Windows style paths.
|
|
|
|
# MSYS2 runtime converts paths in the command line automatically.
|
|
|
|
# However, for our test linker scripts, we have to prepare
|
|
|
|
# the correct paths manually.
|
|
|
|
proc get_base_dir_for_scripts {} {
|
|
|
|
global base_dir
|
|
|
|
global get_base_dir_for_scripts_saved
|
|
|
|
|
|
|
|
if { ![info exists get_base_dir_for_scripts_saved] } {
|
|
|
|
set get_base_dir_for_scripts_saved $base_dir
|
|
|
|
if { ([ishost *-*-cygwin] || [ishost *-*-mingw*] )
|
|
|
|
&& ![catch "exec cygpath -m $base_dir" base_dir_converted] } {
|
|
|
|
set get_base_dir_for_scripts_saved $base_dir_converted
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $get_base_dir_for_scripts_saved
|
|
|
|
}
|
|
|
|
|
2014-10-15 08:59:41 +08:00
|
|
|
# Entries in the array-tables:
|
2014-10-17 19:10:18 +08:00
|
|
|
# 0: Testtype; an inclusive bitmask indicating that the test should run on a
|
|
|
|
# build configured for: 1: non-sysroot, 2: sysroot != "/", 4: sysroot == "/".
|
2014-10-15 08:59:41 +08:00
|
|
|
# 1: Description, forming part of the dejagnu test-name.
|
|
|
|
# 2: Replacement for @p@.
|
|
|
|
# 3: Option to pass to linker (usually something with --sysroot).
|
|
|
|
# 4: Message substring; a substring to match against the error message
|
|
|
|
# if an error is expected, or empty if no error is expected.
|
|
|
|
#
|
|
|
|
# If the replacement or option contains @cwd@, that'll be replaced by
|
|
|
|
# "$base_dir/tmpdir", the full path to the location of the script
|
|
|
|
# (with the actual files in the "sysroot" subdirectory). If the
|
|
|
|
# description contains @cwd@, that will be replaced by "<CWD>".
|
|
|
|
|
|
|
|
set sysroot_prefix_tests {
|
2014-10-17 19:10:18 +08:00
|
|
|
{7 "plain -Lpath" "sysroot/" {} ""}
|
|
|
|
{7 "root-anchored but -Lpath" "/sysroot/" {} "cannot find"}
|
|
|
|
{7 "full-path" "@cwd@/sysroot/" {} ""}
|
|
|
|
{7 "root-anchored =-prefixed -Lpath" "=/sysroot/" {} "cannot find"}
|
2017-05-18 22:07:59 +08:00
|
|
|
{7 "root-anchored $SYSROOT-prefixed -Lpath" "$SYSROOT/sysroot/" {} "cannot find"}
|
2014-10-17 19:10:18 +08:00
|
|
|
{7 "plain =-prefixed with empty" "=sysroot/" "--sysroot=" ""}
|
2017-05-18 22:07:59 +08:00
|
|
|
{7 "plain $SYSROOT-prefixed with empty" "$SYSROOTsysroot/" "--sysroot=" ""}
|
2014-10-17 19:10:18 +08:00
|
|
|
{6 "root-anchored but script outside sysroot" "/" "--sysroot=@cwd@/sysroot" "cannot find"}
|
|
|
|
{6 "root-anchored and script inside sysroot" "/sysroot/" "--sysroot=@cwd@" ""}
|
|
|
|
{6 "root-anchored =-prefixed script outside" "=/" "--sysroot=@cwd@/sysroot" ""}
|
2017-05-18 22:07:59 +08:00
|
|
|
{6 "root-anchored $SYSROOT-prefixed script outside" "$SYSROOT/" "--sysroot=@cwd@/sysroot" ""}
|
2014-10-17 19:10:18 +08:00
|
|
|
{6 "root-anchored =-prefixed script inside" "=/sysroot/" "--sysroot=@cwd@" ""}
|
2017-05-18 22:07:59 +08:00
|
|
|
{6 "root-anchored $SYSROOT-prefixed script inside" "$SYSROOT/sysroot/" "--sysroot=@cwd@" ""}
|
2014-10-15 08:59:41 +08:00
|
|
|
{2 "plain =-prefixed without but -Lpath" "=sysroot/" {} "cannot find"}
|
2017-05-18 22:07:59 +08:00
|
|
|
{2 "plain $SYSROOT-prefixed without but -Lpath" "$SYSROOTsysroot/" {} "cannot find"}
|
2014-10-15 08:59:41 +08:00
|
|
|
{2 "full-path =-prefixed without" "=@cwd@/sysroot/" {} "cannot find"}
|
2017-05-18 22:07:59 +08:00
|
|
|
{2 "full-path $SYSROOT-prefixed without" "$SYSROOT@cwd@/sysroot/" {} "cannot find"}
|
2014-10-15 08:59:41 +08:00
|
|
|
{1 "plain =-prefixed -Lpath" "=sysroot/" {} ""}
|
2017-05-18 22:07:59 +08:00
|
|
|
{1 "plain $SYSROOT-prefixed -Lpath" "$SYSROOTsysroot/" {} ""}
|
2014-10-15 08:59:41 +08:00
|
|
|
{1 "full-path =-prefixed without" "=@cwd@/sysroot/" {} ""}
|
2017-05-18 22:07:59 +08:00
|
|
|
{1 "full-path $SYSROOT-prefixed without" "$SYSROOT@cwd@/sysroot/" {} ""}
|
2014-10-15 08:59:41 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
# May have to provide a target-specific assembler option for some targets.
|
|
|
|
set gasopt ""
|
|
|
|
|
|
|
|
# Intentionally similar to the ubiquitous glibc libc.so script.
|
|
|
|
set template "GROUP ( @q@@p@tmp/ldtest-xyzzy/libx.a@q@ AS_NEEDED ( @q@@p@tmp/ldtest-xyzzy/liby.a@q@ ) )"
|
|
|
|
|
|
|
|
# Set up everything from the variables above.
|
|
|
|
proc sysroot_prefix_test_setup { } {
|
|
|
|
global as gasopt srcdir subdir ar
|
|
|
|
|
|
|
|
if {![ld_assemble_flags $as $gasopt $srcdir/$subdir/pr14962a.s tmpdir/main.o]} {
|
2016-12-22 09:37:31 +08:00
|
|
|
perror "Error assembling a trivial file for sysroot-prefix tests framework"
|
2014-10-15 08:59:41 +08:00
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
# We need somewhere under tmpdir to point the sysroot, a subdirectory
|
|
|
|
# that is benevolent if it escapes into "/".
|
|
|
|
remote_exec host "mkdir -p tmpdir/sysroot/tmp/ldtest-xyzzy"
|
|
|
|
|
|
|
|
# 0: a "main" object that needs a symbol (x) (most portably by
|
|
|
|
# using a pre-existing file). 1: a library with an object that
|
|
|
|
# provides that symbol and needs another one (y). 2: another
|
|
|
|
# library with a third object providing that other symbol.
|
|
|
|
set sysroot_prefix_tests_framework_objects {
|
|
|
|
{"pr14962a.s" "main" ""}
|
|
|
|
{"sysroot-prefix-x.s" "x" "x"}
|
|
|
|
{"sysroot-prefix-y.s" "y" "y"}
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach test_object $sysroot_prefix_tests_framework_objects {
|
|
|
|
set sname [lindex $test_object 0]
|
|
|
|
set onamebase [lindex $test_object 1]
|
|
|
|
set oname "tmpdir/$onamebase.o"
|
|
|
|
set libnamebase [lindex $test_object 2]
|
|
|
|
|
|
|
|
if ![ld_assemble_flags $as $gasopt $srcdir/$subdir/$sname $oname] {
|
2016-12-22 09:37:31 +08:00
|
|
|
perror "Error assembling trivial file $sname for sysroot-prefix tests framework"
|
2014-10-15 08:59:41 +08:00
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
if { [string length $libnamebase] != 0 &&
|
|
|
|
![ar_simple_create $ar "" tmpdir/sysroot/tmp/ldtest-xyzzy/lib$libnamebase.a $oname] } {
|
2016-12-22 09:37:31 +08:00
|
|
|
perror "Error creating archive $libnamebase for sysroot-prefix tests framework"
|
2014-10-15 08:59:41 +08:00
|
|
|
return 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
# Run a single linker test.
|
|
|
|
proc single_sysroot_prefix_test { type xtestname finalscript ldopt errstr } {
|
|
|
|
global ld exec_output with_sysroot
|
|
|
|
set scriptname "tmpdir/libsysroottest.a"
|
|
|
|
set testname "sysroot-prefix $xtestname"
|
|
|
|
|
|
|
|
if { ($type & ($with_sysroot + 1)) == 0 } {
|
|
|
|
unsupported $testname
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if [catch { set ofd [open $scriptname w] } x] {
|
|
|
|
perror "$x"
|
|
|
|
unresolved $testname
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
puts $ofd "$finalscript"
|
|
|
|
close $ofd
|
2020-09-03 08:04:37 +08:00
|
|
|
verbose -log "script $scriptname: $finalscript"
|
2014-10-15 08:59:41 +08:00
|
|
|
|
Run more ld tests when not native
Many of the ld tests are not run for cross builds, in some cases
because the test needs to run a newly linked executable, and in others
simply because it was easier to write the test for native only. Even
when a test needs to run, it's good to compile and link to exercise
the linker. So that's what this patch does. I've also rid us of
the old ld_link procedure with all the HOSTING_CRT0 etc. setup. It's
much simpler to just link with $CC.
This does mean that a cross build with cross-compiler installed but
no cross C-library will give lots of failures. If that turns out to
be too annoying, I guess we can write a tcl procedure to detect it and
not run all the extra tests.
* Makefile.am (bootstrap): Delete rule.
(ld-partial, ld1, ld1-full, ld2, ld3): Likewise.
(HOSTING_CRT0, HOSTING_SCRT0): Don't define.
(HOSTING_LIBS, HOSTING_SLIBS, HOSTING_EMU): Likewise.
* configure.ac (HOSTING_CRT0, HOSTING_SCRT0): Don't define.
(HOSTING_LIBS, HOSTING_SLIBS): Likewise.
* configure.host (HOSTING_CRT0, HOSTING_LIBS): Don't define.
* Makefile.in: Regenerate.
* configure: Regenerate.
* testsuite/config/default.exp (get_link_files): Delete.
(HOSTING_CRT0, HOSTING_SCRT0, HOSTING_LIBS, HOSTING_SLIBS): Don't
define.
(ld_simple_link): Delete.
* testsuite/lib/ld-lib.exp (default_ld_link): Delete
(default_ld_simple_link): Rename to default_ld_link.
(ld_simple_link_defsyms): Rename to ld_link_defsyms.
(run_ld_link_tests): Use ld_link, not ld_simple_link.
(run_cc_link_tests): Likewise.
(run_ld_link_exec_tests): Use $CC or $CXX to link, not $ld.
Don't run exe when not native, and return unsupported.
* testsuite/ld-bootstrap/bootstrap.exp: Create gccld1 etc. dirs.
Link ld1 etc. using $CC.
* testsuite/ld-cdtest/cdtest.exp: Link cdtest using $CC.
* testsuite/ld-checks/checks.exp: Use ld_link, not ld_simple_link.
* testsuite/ld-cygwin/exe-export.exp: Likewise.
* testsuite/ld-elf/binutils.exp: Likewise.
* testsuite/ld-elf/eh-group.exp: Likewise.
* testsuite/ld-elf/exclude.exp: Likewise.
* testsuite/ld-elf/frame.exp: Likewise.
* testsuite/ld-elf/sec-to-seg.exp: Likewise.
* testsuite/ld-elf/tls_common.exp: Likewise.
* testsuite/ld-elfcomm/elfcomm.exp: Likewise.
* testsuite/ld-fastcall/fastcall.exp: Likewise.
* testsuite/ld-gc/gc.exp: Likewise.
* testsuite/ld-ifunc/binutils.exp: Likewise.
* testsuite/ld-mep/mep.exp: Likewise.
* testsuite/ld-mips-elf/mips-elf-flags.exp: Likewise.
* testsuite/ld-mn10300/mn10300.exp: Likewise.
* testsuite/ld-nios2/nios2.exp: Likewise.
* testsuite/ld-pe/pe-compile.exp: Likewise.
* testsuite/ld-pe/pe-run.exp: Likewise.
* testsuite/ld-pe/pe-run2.exp: Likewise.
* testsuite/ld-plugin/plugin.exp: Likewise.
* testsuite/ld-scripts/align.exp: Likewise.
* testsuite/ld-scripts/alignof.exp: Likewise.
* testsuite/ld-scripts/assert.exp: Likewise.
* testsuite/ld-scripts/defined.exp: Likewise.
* testsuite/ld-scripts/extern.exp: Likewise.
* testsuite/ld-scripts/log2.exp: Likewise.
* testsuite/ld-scripts/map-address.exp: Likewise.
* testsuite/ld-scripts/phdrs.exp: Likewise.
* testsuite/ld-scripts/phdrs2.exp: Likewise.
* testsuite/ld-scripts/script.exp: Likewise.
* testsuite/ld-scripts/section-flags.exp: Likewise.
* testsuite/ld-scripts/sizeof.exp: Likewise.
* testsuite/ld-scripts/sysroot-prefix.exp: Likewise.
* testsuite/ld-scripts/weak.exp: Likewise.
* testsuite/ld-selective/selective.exp: Likewise.
* testsuite/ld-sh/sh.exp: Likewise.
* testsuite/ld-sh/sh64/relax.exp: Likewise.
* testsuite/ld-sh/sh64/relfail.exp: Likewise.
* testsuite/ld-srec/srec.exp: Likewise.
* testsuite/ld-tic6x/tic6x.exp: Likewise.
* testsuite/ld-undefined/weak-undef.exp: Likewise.
* testsuite/ld-versados/versados.exp: Likewise.
* testsuite/ld-x86-64/dwarfreloc.exp: Likewise.
* testsuite/ld-xtensa/coalesce.exp: Likewise.
* testsuite/ld-xtensa/diff_overflow.exp: Likewise.
* testsuite/ld-xtensa/lcall.exp: Likewise.
* testsuite/ld-elf/audit.exp: Run non-native too.
* testsuite/ld-elf/compress.exp: Likewise. Replace ld options with
gcc -Wl, options.
* testsuite/ld-elf/dwarf.exp: Run non-native too. Use ld_link,
not ld_simple_link. Add -Wl,--no-as-needed to some tests.
* testsuite/ld-elf/elf.exp: Run non-native too. Formatting.
* testsuite/ld-elf/indirect.exp: Run non-native too. Add
-Wl,--no-as-needed to most tests.
* testsuite/ld-elf/shared.exp: Run non-native too. Use braces
to simplify quoting. Set run_tests using [list] rather than
brace assignment to expand $extralibs. Add -Wl,--no-as-needed
to many test. Prefix ld options with -Wl,.
(mix_pic_and_non_pic): Don't run exe if not native.
* testsuite/ld-elf/wrap.exp: Run non-native too. Add
-Wl,--no-as-needed and prefix ld options with -Wl,.
* testsuite/ld-elfvers/vers.exp: Run non-native too. Use ld_link,
not ld_simple_link.
* testsuite/ld-elfvsb/elfvsb.exp: Likewise.
(visibility_test): Don't run exe if not native.
* testsuite/ld-elfweak/elfweak.exp: Run non-native too. Use ld_link,
not ld_simple_link.
(build_exec): Don't run exe if not native.
* testsuite/ld-ifunc/ifunc.exp: Run non-native too. Use ld_link,
not ld_simple_link. Link using $CC. Add -Wl,--no-as-needed
to some tests and prefix ld options with -Wl,. Expect GNU
for hppa-linux even when no ifuncs. Delete cleanup.
* testsuite/ld-pie/pie.exp: Run non-native too.
* testsuite/ld-plugin/lto.exp: Likewise.
* testsuite/ld-shared/shared.exp: Likewise. Use ld_link,
not ld_simple_link.
(shared_test): Don't run exe if not native.
* testsuite/ld-size/size.exp: Run non-native too. Add
-Wl,--no-as-needed to some tests. Prefix ld options with -Wl,.
* testsuite/ld-unique/unique.exp: Run non-native too. Use ld_link,
not ld_simple_link. Link using $CC. Add -Wl,--no-as-needed
to some tests and prefix ld options with -Wl,. Expect GNU
for hppa-linux even when no unique syms. Delete cleanup.
* testsuite/ld-x86-64/tls.exp: Add -Wl,--no-as-needed to some
tests and prefix ld options with -Wl,.
* testsuite/ld-x86-64/x86-64.exp: Use ld_link, not ld_simple_link.
Add -Wl,--no-as-needed to some tests. Prefix ld options with -Wl,.
2017-01-02 20:15:37 +08:00
|
|
|
set res [ld_link $ld tmpdir/output "$ldopt tmpdir/main.o -Ltmpdir -lsysroottest"]
|
2014-10-15 08:59:41 +08:00
|
|
|
set ld_output "$exec_output"
|
|
|
|
set expect_success [expr [string length $errstr] == 0]
|
|
|
|
|
|
|
|
if { $res == $expect_success &&
|
|
|
|
($expect_success || [regexp "$errstr" $ld_output]) } {
|
|
|
|
pass $testname
|
|
|
|
catch "exec rm -f $scriptname"
|
|
|
|
} {
|
|
|
|
fail $testname
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# Run all interesting variants from an option-and-path combination.
|
|
|
|
proc run_sysroot_prefix_test { type name templ p ldopt errstr } {
|
|
|
|
global base_dir
|
|
|
|
set qlist { { "quoted" "\"" } { "unquoted" {} } }
|
|
|
|
|
|
|
|
regsub -all "@p@" $templ $p templ
|
2017-02-15 17:13:56 +08:00
|
|
|
regsub -all "@cwd@" $templ "[get_base_dir_for_scripts]/tmpdir" templ
|
2014-10-15 08:59:41 +08:00
|
|
|
regsub -all "@cwd@" $ldopt "$base_dir/tmpdir" ldopt
|
|
|
|
regsub -all "@cwd@" $name "<CWD>" name
|
|
|
|
|
|
|
|
foreach qitems $qlist {
|
|
|
|
regsub -all "@q@" $templ [lindex $qitems 1] finalscript
|
|
|
|
single_sysroot_prefix_test $type "$name, [lindex $qitems 0]" \
|
|
|
|
$finalscript $ldopt $errstr
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# Run a list of option-and-path test-combinations.
|
|
|
|
proc run_sysroot_prefix_tests { descr templ items } {
|
|
|
|
foreach item $items {
|
|
|
|
set type [lindex $item 0]
|
|
|
|
set name [lindex $item 1]
|
|
|
|
set p [lindex $item 2]
|
|
|
|
set ldopt [lindex $item 3]
|
|
|
|
set errstr [lindex $item 4]
|
|
|
|
run_sysroot_prefix_test $type "$descr $name" $templ "$p" "$ldopt" "$errstr"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ![sysroot_prefix_test_setup] {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
run_sysroot_prefix_tests "common" $template $sysroot_prefix_tests
|