Browse Source
* ld-scripts/sysroot-prefix.exp, ld-scripts/sysroot-prefix-x.s, ld-scripts/sysroot-prefix-y.s: New files. N.B: full coverage is only possible with complementary use of --with-sysroot when configuring.gdb-7.9-branch
4 changed files with 194 additions and 0 deletions
@ -0,0 +1,5 @@ |
|||
.data |
|||
.globl x |
|||
x: |
|||
.dc.a y |
|||
|
|||
@ -0,0 +1,4 @@ |
|||
.data |
|||
.globl y |
|||
y: |
|||
.dc.a 0 |
|||
@ -0,0 +1,183 @@ |
|||
# Copyright (C) 2014 Free Software Foundation, Inc. |
|||
# |
|||
# 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. |
|||
|
|||
# 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 |
|||
# "--with-sysroot X". We ignore that X can actually be set to |
|||
# interfere with the tests, as that's unlikely to be useful, and |
|||
# assume that the build-directory (aka. $base_dir) does not contain X. |
|||
set with_sysroot [check_sysroot_available] |
|||
verbose -log "Has (non-empty) sysroot support: $with_sysroot" |
|||
|
|||
# Entries in the array-tables: |
|||
# 0: Testtype (1: only non-sysroot, 2: only sysroot, 3: either). |
|||
# 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 { |
|||
{3 "plain -Lpath" "sysroot/" {} ""} |
|||
{3 "root-anchored but -Lpath" "/sysroot/" {} "cannot find"} |
|||
{3 "full-path" "@cwd@/sysroot/" {} ""} |
|||
{3 "root-anchored =-prefixed -Lpath" "=/sysroot/" {} "cannot find"} |
|||
{3 "full-path =-prefixed with empty" "=@cwd@/sysroot/" "--sysroot=" ""} |
|||
{3 "plain =-prefixed with empty" "=sysroot/" "--sysroot=" ""} |
|||
{2 "root-anchored but script outside sysroot" "/" "--sysroot=@cwd@/sysroot" "cannot find"} |
|||
{2 "root-anchored and script inside sysroot" "/sysroot/" "--sysroot=@cwd@" ""} |
|||
{2 "root-anchored =-prefixed script outside" "=/" "--sysroot=@cwd@/sysroot" ""} |
|||
{2 "root-anchored =-prefixed script inside" "=/sysroot/" "--sysroot=@cwd@" ""} |
|||
{2 "plain =-prefixed without but -Lpath" "=sysroot/" {} "cannot find"} |
|||
{2 "full-path =-prefixed without" "=@cwd@/sysroot/" {} "cannot find"} |
|||
{1 "plain =-prefixed -Lpath" "=sysroot/" {} ""} |
|||
{1 "full-path =-prefixed without" "=@cwd@/sysroot/" {} ""} |
|||
} |
|||
|
|||
# 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]} { |
|||
error "Error assembling a trivial file for sysroot-prefix tests framework" |
|||
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] { |
|||
error "Error assembling trivial file $sname for sysroot-prefix tests framework" |
|||
return 0 |
|||
} |
|||
|
|||
if { [string length $libnamebase] != 0 && |
|||
![ar_simple_create $ar "" tmpdir/sysroot/tmp/ldtest-xyzzy/lib$libnamebase.a $oname] } { |
|||
error "Error creating archive $libnamebase for sysroot-prefix tests framework" |
|||
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 |
|||
verbose -log "script: $finalscript" |
|||
|
|||
set res [ld_simple_link $ld tmpdir/output "$ldopt tmpdir/main.o -Ltmpdir -lsysroottest"] |
|||
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 |
|||
regsub -all "@cwd@" $templ "$base_dir/tmpdir" templ |
|||
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 |
|||
Loading…
Reference in new issue