# Test basic linker script functionality # By Ian Lance Taylor, Cygnus Support # Copyright 1999-2013 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. set testname "script" if ![ld_assemble $as $srcdir/$subdir/script.s tmpdir/script.o] { unresolved $testname return } proc check_script { } { global nm global testname global nm_output if ![ld_nm $nm "" tmpdir/script] { unresolved $testname return } if {![info exists nm_output(text_start)] \ || ![info exists nm_output(text_end)] \ || ![info exists nm_output(data_start)] \ || ![info exists nm_output(data_end)]} { send_log "bad output from nm\n" verbose "bad output from nm" fail $testname return } set passes 1 set text_end 0x104 set data_end 0x1004 if [istarget *c4x*-*-*] then { set text_end 0x101 set data_end 0x1001 } if [istarget *c54x*-*-*] then { set text_end 0x102 set data_end 0x1002 } if {$nm_output(text_start) != 0x100} { send_log "text_start == $nm_output(text_start)\n" verbose "text_start == $nm_output(text_start)" set passes 0 } if {$nm_output(text_end) < $text_end \ || $nm_output(text_end) > 0x110} { send_log "text_end == $nm_output(text_end)\n" verbose "text_end == $nm_output(text_end)" set passes 0 } if {$nm_output(data_start) != 0x1000} { send_log "data_start == $nm_output(data_start)\n" verbose "data_start == $nm_output(data_start)" set passes 0 } if {$nm_output(data_end) < $data_end \ || $nm_output(data_end) > 0x1010} { send_log "data_end == $nm_output(data_end)\n" verbose "data_end == $nm_output(data_end)" set passes 0 } if { $passes } { pass $testname } else { fail $testname } } # PE targets need to set the image base to 0 to avoid complications from nm. set flags "" if {[istarget "*-*-pe*"] \ || [istarget "*-*-cygwin*"] \ || [istarget "*-*-mingw*"] \ || [istarget "*-*-winnt*"] \ || [istarget "*-*-nt"] \ || [istarget "*-*-interix*"] } then { set flags "--image-base 0" } if ![ld_simple_link $ld tmpdir/script "$flags -T $srcdir/$subdir/script.t tmpdir/script.o"] { fail $testname } else { check_script } set testname "MRI script" if ![ld_simple_link $ld tmpdir/script "$flags -c $srcdir/$subdir/scriptm.t"] { fail $testname } else { check_script } set testname "MEMORY" if ![ld_simple_link $ld tmpdir/script "$flags -T $srcdir/$subdir/memory.t tmpdir/script.o"] { fail $testname } else { check_script } set test_script_list [lsort [glob $srcdir/$subdir/region-alias-*.t]] foreach test_script $test_script_list { set testname [file tail $test_script] if ![ld_simple_link $ld tmpdir/script "$flags -T $test_script tmpdir/script.o"] { xfail "REGION_ALIAS: $testname" } else { xpass "REGION_ALIAS: $testname" } } set testname "ALIGN_WITH_INPUT" if ![ld_simple_link $ld tmpdir/script "$flags -T $srcdir/$subdir/align-with-input.t tmpdir/script.o"] { xfail $testname } else { xpass $testname }