From ef1ab8e216a01d94a4cd23dc94363a78e2971b84 Mon Sep 17 00:00:00 2001 From: Hans-Peter Nilsson Date: Wed, 15 Oct 2014 02:59:41 +0200 Subject: [PATCH] Add sysroot-prefix ld linker tests. * 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. --- ld/testsuite/ChangeLog | 2 + ld/testsuite/ld-scripts/sysroot-prefix-x.s | 5 + ld/testsuite/ld-scripts/sysroot-prefix-y.s | 4 + ld/testsuite/ld-scripts/sysroot-prefix.exp | 183 +++++++++++++++++++++ 4 files changed, 194 insertions(+) create mode 100644 ld/testsuite/ld-scripts/sysroot-prefix-x.s create mode 100644 ld/testsuite/ld-scripts/sysroot-prefix-y.s create mode 100644 ld/testsuite/ld-scripts/sysroot-prefix.exp diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index f8dcc96f8a..d6bc2b0982 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2014-10-15 Hans-Peter Nilsson + * ld-scripts/sysroot-prefix.exp, ld-scripts/sysroot-prefix-x.s, + ld-scripts/sysroot-prefix-y.s: New files. * lib/ld-lib.exp (check_sysroot_available): New proc. 2014-10-04 Alan Modra diff --git a/ld/testsuite/ld-scripts/sysroot-prefix-x.s b/ld/testsuite/ld-scripts/sysroot-prefix-x.s new file mode 100644 index 0000000000..9b81905b69 --- /dev/null +++ b/ld/testsuite/ld-scripts/sysroot-prefix-x.s @@ -0,0 +1,5 @@ + .data + .globl x +x: + .dc.a y + diff --git a/ld/testsuite/ld-scripts/sysroot-prefix-y.s b/ld/testsuite/ld-scripts/sysroot-prefix-y.s new file mode 100644 index 0000000000..f05ffa01d6 --- /dev/null +++ b/ld/testsuite/ld-scripts/sysroot-prefix-y.s @@ -0,0 +1,4 @@ + .data + .globl y +y: + .dc.a 0 diff --git a/ld/testsuite/ld-scripts/sysroot-prefix.exp b/ld/testsuite/ld-scripts/sysroot-prefix.exp new file mode 100644 index 0000000000..cf434dfa25 --- /dev/null +++ b/ld/testsuite/ld-scripts/sysroot-prefix.exp @@ -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 "". + +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 "" 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