diff options
Diffstat (limited to 'binutils-2.21/ld/testsuite/ld-bootstrap/bootstrap.exp')
-rw-r--r-- | binutils-2.21/ld/testsuite/ld-bootstrap/bootstrap.exp | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/binutils-2.21/ld/testsuite/ld-bootstrap/bootstrap.exp b/binutils-2.21/ld/testsuite/ld-bootstrap/bootstrap.exp new file mode 100644 index 0000000..74b6a5c --- /dev/null +++ b/binutils-2.21/ld/testsuite/ld-bootstrap/bootstrap.exp @@ -0,0 +1,210 @@ +# Expect script for LD Bootstrap Tests +# Copyright 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2004, +# 2005, 2006, 2007, 2009 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. +# +# Written by Jeffrey Wheat (cassidy@cygnus.com) +# Rewritten by Ian Lance Taylor (ian@cygnus.com) +# + +# Make sure that ld can bootstrap itself. + +# This test can only be run if ld generates native executables. +if ![isnative] { + return +} + +# Determine if plugin support is present. +remote_exec host "$nm --help" "" "/dev/null" "plugin-support" +set tmp [file_contents "plugin-support"] +regexp ".*\(--plugin\).*\n" $tmp foo plugins +if [info exists plugins] then { + set plugins "yes" +} else { + set plugins "no" +} + +# LD can have plugin support even if BFD does not. +if [check_plugin_api_available] { + set plugins "yes" +} + +# Bootstrap ld. First link the object files together using -r, in +# order to test -r. Then link the result into an executable, ld1, to +# really test -r. Use ld1 to link a fresh ld, ld2. Use ld2 to link a +# new ld, ld3. ld2 and ld3 should be identical. + +foreach flags {"" "strip" "--static" "--traditional-format" + "--no-keep-memory" "--relax"} { + set do_strip "no" + if {"$flags" == "strip"} { + set testname "bootstrap with $flags" + set flags "" + set do_strip "yes" + } else { if {"$flags" != ""} { + set testname "bootstrap with $flags" + } else { + set testname "bootstrap" + }} + + # --static is meaningless and --relax is incompatible with -r. + set partial_flags "$flags" + if { "$flags" == "--static" || "$flags" == "--relax" } { + set partial_flags "" + } + + # This test can only be run if we have the ld build directory, + # since we need the object files. + if {$ld != "$objdir/ld-new"} { + untested $testname + continue + } + + # Plugin support requires linking with a dynamic library which + # means that these + if { $flags == "--static" && $plugins == "yes" } then { + untested $testname + continue + } + + # If we only have a shared libbfd, we probably can't run the + # --static test.will fail. + if { $flags == "--static" && ! [string match "*libbfd.a*" $BFDLIB] } then { + untested $testname + continue + } + + if ![ld_relocate $ld tmpdir/ld-partial.o "$partial_flags $OFILES"] { + fail $testname + continue + } + + # On AIX, you need to specify an import list when using --static. + # You only want the import list when creating the final + # executable. + if { [istarget "*-*-aix*"] + && ![istarget "ia64-*-aix*"]} { + if {"$flags" == "--static"} { + set flags "--static -bI:/lib/syscalls.exp" + } + } + + # On Cygwin, -lintl may require -liconv when linking statically. + set extralibs "" + if { [istarget "*-*-cygwin*"]} { + if {"$flags" == "--static"} { + set extralibs "-liconv" + } + } + + # Plugin support requires linking with libdl. + if { $plugins == "yes" } { + set extralibs "$extralibs -ldl" + } + + # On Irix 5, linking with --static only works if all the files are + # compiled using -non_shared. + if {"$flags" == "--static"} { + setup_xfail "mips*-*-irix5*" + } + + if ![ld_link $ld tmpdir/ld1 "$flags tmpdir/ld-partial.o $BFDLIB $LIBIBERTY $extralibs"] { + fail $testname + continue + } + + if {"$do_strip" == "yes"} { + verbose -log "$strip tmpdir/ld1" + catch "exec $strip tmpdir/ld1" exec_output + if ![string match "" $exec_output] then { + verbose -log "$exec_output" + fail $testname + continue + } + } + + if ![ld_link tmpdir/ld1 tmpdir/ld2 "$flags $OFILES $BFDLIB $LIBIBERTY $extralibs"] { + fail $testname + continue + } + + if ![ld_link tmpdir/ld2 tmpdir/ld3 "$flags $OFILES $BFDLIB $LIBIBERTY $extralibs"] { + fail $testname + continue + } + + if {"$flags" == "--static"} { + if { [istarget ia64-*-elf*] + || [istarget ia64-*-linux*] } { + # On ia64, tmpdir/ld2 != tmpdir/ld3 is normal since they are + # generated by different linkers, tmpdir/ld1 and tmpdir/ld2. + # So we rebuild tmpdir/ld2 with tmpdir/ld3. + if ![ld_link tmpdir/ld3 tmpdir/ld2 "$flags $OFILES $BFDLIB $LIBIBERTY"] { + fail $testname + continue + } + } + } else { + if { [istarget mips*-*-linux*] } { + # On Linux/mips, tmpdir/ld2 != tmpdir/ld3 is normal since + # they are generated by different linkers, tmpdir/ld1 and + # tmpdir/ld2. So we rebuild tmpdir/ld2 with tmpdir/ld3. + if ![ld_link tmpdir/ld3 tmpdir/ld2 "$flags $OFILES $BFDLIB $LIBIBERTY"] { + fail $testname + continue + } + } + } + + if {[istarget "*-*-pe"] + || [istarget "*-*-wince"] + || [istarget "*-*-cygwin*"] + || [istarget "*-*-winnt*"] + || [istarget "*-*-mingw*"] + || [istarget "*-*-interix*"] + || [istarget "*-*-beospe*"] + || [istarget "*-*-netbsdpe*"]} { + # Trim off the date present in PE binaries by only looking + # at the ends of the files + # Although this works, a way to set the date would be better. + # Removing or zeroing the date stamp in the binary produced by + # the linker is not possible as it is required by the target OS. + set do_compare [string map {16 220 f1 tmpdir/ld2 f2 tmpdir/ld3 tmp-foo1 tmpdir/ld2tail tmp-foo2 tmpdir/ld3tail} $DO_COMPARE] + send_log "$do_compare\n" + verbose "$do_compare" + catch "exec sh -c [list $do_compare]" exec_output + } else { + send_log "cmp tmpdir/ld2 tmpdir/ld3\n" + verbose "cmp tmpdir/ld2 tmpdir/ld3" + catch "exec cmp tmpdir/ld2 tmpdir/ld3" exec_output + } + set exec_output [prune_warnings $exec_output] + + if [string match "" $exec_output] then { + pass $testname + } else { + send_log "$exec_output\n" + verbose "$exec_output" 1 + + fail $testname + } +} + +catch "exec rm -f tmpdir/ld-partial.o tmpdir/ld1 tmpdir/ld2 tmpdir/ld3" status +catch "exec rm -f tmpdir/ld2tail tmpdir/ld3tail" status |