Home | History | Annotate | Download | only in ld-scripts
      1 # Copyright (C) 2014 Free Software Foundation, Inc.
      2 #
      3 # This file is part of the GNU Binutils.
      4 #
      5 # This program is free software; you can redistribute it and/or modify
      6 # it under the terms of the GNU General Public License as published by
      7 # the Free Software Foundation; either version 3 of the License, or
      8 # (at your option) any later version.
      9 #
     10 # This program is distributed in the hope that it will be useful,
     11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13 # GNU General Public License for more details.
     14 #
     15 # You should have received a copy of the GNU General Public License
     16 # along with this program; if not, write to the Free Software
     17 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     18 # MA 02110-1301, USA.
     19 
     20 # Check that scripts using the "=" sysroot-prefix work, for both
     21 # toolchains with and without --sysroot support.
     22 
     23 # We test this by emitting archives into a subdirectory and expect
     24 # constructs such as GROUP and AS_NEEDED (the only two constructs
     25 # actually tested) to find them (or not); both quoted and unquoted
     26 # paths, with different prefixes on the path and with --sysroot
     27 # present or not, with different arguments.
     28 
     29 # Find out if the linker supports sysroot; if it was configured
     30 # "--with-sysroot X" where X is a non-empty string.
     31 set with_sysroot [check_sysroot_available]
     32 verbose -log "Has (non-empty) sysroot support: $with_sysroot; \"$ld_sysroot\""
     33 
     34 # We also need to know if the sysroot is "/" (a common use) as some of
     35 # the tests prepend sysroot to the current directory and on most
     36 # common systems "//dir/path" is handled as "/dir/path".
     37 if {$ld_sysroot == "/"} {
     38     # Use a modified test-subset for testing.
     39     set with_sysroot 3
     40 }
     41 
     42 # Entries in the array-tables:
     43 # 0: Testtype; an inclusive bitmask indicating that the test should run on a
     44 # build configured for: 1: non-sysroot, 2: sysroot != "/", 4: sysroot == "/".
     45 # 1: Description, forming part of the dejagnu test-name.
     46 # 2: Replacement for @p@.
     47 # 3: Option to pass to linker (usually something with --sysroot).
     48 # 4: Message substring; a substring to match against the error message
     49 # if an error is expected, or empty if no error is expected.
     50 #
     51 # If the replacement or option contains @cwd@, that'll be replaced by
     52 # "$base_dir/tmpdir", the full path to the location of the script
     53 # (with the actual files in the "sysroot" subdirectory).  If the
     54 # description contains @cwd@, that will be replaced by "<CWD>".
     55 
     56 set sysroot_prefix_tests {
     57     {7 "plain -Lpath" "sysroot/" {} ""}
     58     {7 "root-anchored but -Lpath" "/sysroot/" {} "cannot find"}
     59     {7 "full-path" "@cwd@/sysroot/" {} ""}
     60     {7 "root-anchored =-prefixed -Lpath" "=/sysroot/" {} "cannot find"}
     61     {7 "full-path =-prefixed with empty" "=@cwd@/sysroot/" "--sysroot=" ""}
     62     {7 "plain =-prefixed with empty" "=sysroot/" "--sysroot=" ""}
     63     {6 "root-anchored but script outside sysroot" "/" "--sysroot=@cwd@/sysroot" "cannot find"}
     64     {6 "root-anchored and script inside sysroot" "/sysroot/" "--sysroot=@cwd@" ""}
     65     {6 "root-anchored =-prefixed script outside" "=/" "--sysroot=@cwd@/sysroot" ""}
     66     {6 "root-anchored =-prefixed script inside" "=/sysroot/" "--sysroot=@cwd@" ""}
     67     {2 "plain =-prefixed without but -Lpath" "=sysroot/" {} "cannot find"}
     68     {2 "full-path =-prefixed without" "=@cwd@/sysroot/" {} "cannot find"}
     69     {1 "plain =-prefixed -Lpath" "=sysroot/" {} ""}
     70     {1 "full-path =-prefixed without" "=@cwd@/sysroot/" {} ""}
     71 }
     72 
     73 # May have to provide a target-specific assembler option for some targets.
     74 set gasopt ""
     75 
     76 # Intentionally similar to the ubiquitous glibc libc.so script.
     77 set template "GROUP ( @q@@p@tmp/ldtest-xyzzy/libx.a@q@ AS_NEEDED ( @q@@p@tmp/ldtest-xyzzy/liby.a@q@ ) )"
     78 
     79 # Set up everything from the variables above.
     80 proc sysroot_prefix_test_setup { } {
     81     global as gasopt srcdir subdir ar
     82 
     83     if {![ld_assemble_flags $as $gasopt $srcdir/$subdir/pr14962a.s tmpdir/main.o]} {
     84 	error "Error assembling a trivial file for sysroot-prefix testsframework"
     85 	return 0
     86     }
     87 
     88     # We need somewhere under tmpdir to point the sysroot, a subdirectory
     89     # that is benevolent if it escapes into "/".
     90     remote_exec host "mkdir -p tmpdir/sysroot/tmp/ldtest-xyzzy"
     91 
     92     # 0: a "main" object that needs a symbol (x) (most portably by
     93     # using a pre-existing file).  1: a library with an object that
     94     # provides that symbol and needs another one (y).  2: another
     95     # library with a third object providing that other symbol.
     96     set sysroot_prefix_tests_framework_objects  {
     97 	{"pr14962a.s" "main" ""}
     98 	{"sysroot-prefix-x.s" "x" "x"}
     99 	{"sysroot-prefix-y.s" "y"  "y"}
    100     }
    101 
    102     foreach test_object $sysroot_prefix_tests_framework_objects {
    103 	set sname [lindex $test_object 0]
    104 	set onamebase [lindex $test_object 1]
    105 	set oname "tmpdir/$onamebase.o"
    106 	set libnamebase [lindex $test_object 2]
    107 
    108 	if ![ld_assemble_flags $as $gasopt $srcdir/$subdir/$sname $oname] {
    109 	    error "Error assembling trivial file $sname for sysroot-prefix testsframework"
    110 	    return 0
    111 	}
    112 
    113 	if { [string length $libnamebase] != 0 &&
    114 	     ![ar_simple_create $ar "" tmpdir/sysroot/tmp/ldtest-xyzzy/lib$libnamebase.a $oname] } {
    115 	    error "Error creating archive $libnamebase for sysroot-prefix testsframework"
    116 	    return 0
    117 	}
    118     }
    119 
    120     return 1
    121 }
    122 
    123 # Run a single linker test.
    124 proc single_sysroot_prefix_test { type xtestname finalscript ldopt errstr } {
    125     global ld exec_output with_sysroot
    126     set scriptname "tmpdir/libsysroottest.a"
    127     set testname "sysroot-prefix $xtestname"
    128 
    129     if { ($type & ($with_sysroot + 1)) == 0 } {
    130 	unsupported $testname
    131 	return
    132     }
    133 
    134     if [catch { set ofd [open $scriptname w] } x] {
    135 	perror "$x"
    136 	unresolved $testname
    137 	return
    138     }
    139 
    140     puts $ofd "$finalscript"
    141     close $ofd
    142     verbose -log "script: $finalscript"
    143 
    144     set res [ld_simple_link $ld tmpdir/output "$ldopt tmpdir/main.o -Ltmpdir -lsysroottest"]
    145     set ld_output "$exec_output"
    146     set expect_success [expr [string length $errstr] == 0]
    147 
    148     if { $res == $expect_success &&
    149          ($expect_success || [regexp "$errstr" $ld_output]) } {
    150 	pass $testname
    151 	catch "exec rm -f $scriptname"
    152     } {
    153 	fail $testname
    154     }
    155 }
    156 
    157 # Run all interesting variants from an option-and-path combination.
    158 proc run_sysroot_prefix_test { type name templ p ldopt errstr } {
    159     global base_dir
    160     set qlist { { "quoted" "\"" } { "unquoted" {} } }
    161 
    162     regsub -all "@p@" $templ $p templ
    163     regsub -all "@cwd@" $templ "$base_dir/tmpdir" templ
    164     regsub -all "@cwd@" $ldopt "$base_dir/tmpdir" ldopt
    165     regsub -all "@cwd@" $name "<CWD>" name
    166 
    167     foreach qitems $qlist {
    168 	regsub -all "@q@" $templ [lindex $qitems 1] finalscript
    169 	single_sysroot_prefix_test $type "$name, [lindex $qitems 0]" \
    170 		$finalscript $ldopt $errstr
    171     }
    172 }
    173 
    174 # Run a list of option-and-path test-combinations.
    175 proc run_sysroot_prefix_tests { descr templ items } {
    176     foreach item $items {
    177 	set type [lindex $item 0]
    178 	set name [lindex $item 1]
    179 	set p [lindex $item 2]
    180 	set ldopt [lindex $item 3]
    181 	set errstr [lindex $item 4]
    182 	run_sysroot_prefix_test $type "$descr $name" $templ "$p" "$ldopt" "$errstr"
    183     }
    184 }
    185 
    186 if ![sysroot_prefix_test_setup] {
    187     return
    188 }
    189 
    190 run_sysroot_prefix_tests "common" $template $sysroot_prefix_tests
    191