1 # Test basic linker script functionality
2 # By Ian Lance Taylor
, Cygnus Support
3 # Copyright
(C
) 1999-2016 Free Software Foundation
, Inc.
5 # This file is part of the GNU Binutils.
7 # This
program is free software
; you can redistribute it and
/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation
; either version
3 of the License
, or
10 #
(at your option
) any later version.
12 # This
program is distributed in the hope that it will be useful
,
13 # but WITHOUT
ANY WARRANTY
; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License
for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this
program; if not
, write to the Free Software
19 # Foundation
, Inc.
, 51 Franklin Street
- Fifth Floor
, Boston
,
24 if ![ld_assemble $as $srcdir
/$subdir
/script.s tmpdir
/script.o
] {
29 proc check_script
{ } {
34 if ![ld_nm $nm
"" tmpdir/script] {
39 if {![info exists nm_output
(text_start
)] \
40 ||
![info exists nm_output
(text_end
)] \
41 ||
![info exists nm_output
(data_start
)] \
42 ||
![info exists nm_output
(data_end
)]} {
43 send_log
"bad output from nm\n"
44 verbose
"bad output from nm"
53 if [istarget
*c4x
*-*-*] then {
58 if [istarget
*c54x
*-*-*] then {
63 if {$nm_output
(text_start
) != 0x100} {
64 send_log
"text_start == $nm_output(text_start)\n"
65 verbose
"text_start == $nm_output(text_start)"
69 if {[info exists nm_output
(tred
)] \
70 && $nm_output
(tred
) != (0x100 + 0x8000)} {
71 send_log
"tred == $nm_output(tred)\n"
72 verbose
"tred == $nm_output(tred)"
76 if {$nm_output
(text_end
) < $text_end \
77 || $nm_output
(text_end
) > 0x110} {
78 send_log
"text_end == $nm_output(text_end)\n"
79 verbose
"text_end == $nm_output(text_end)"
83 if {$nm_output
(data_start
) != 0x1000} {
84 send_log
"data_start == $nm_output(data_start)\n"
85 verbose
"data_start == $nm_output(data_start)"
89 if {[info exists nm_output
(fred
)] \
90 && $nm_output
(fred
) != (0x1000 + 0x10000)} {
91 send_log
"fred == $nm_output(fred)\n"
92 verbose
"fred == $nm_output(fred)"
96 if {$nm_output
(data_end
) < $data_end \
97 || $nm_output
(data_end
) > 0x1010} {
98 send_log
"data_end == $nm_output(data_end)\n"
99 verbose
"data_end == $nm_output(data_end)"
110 proc extract_symbol_test
{ testfile testname
} {
114 global target_triplet
116 set copyfile tmpdir
/extract
117 set args "--extract-symbol $testfile $copyfile"
118 set exec_output
[run_host_cmd $objcopy $
args]
119 if ![string equal
"" $exec_output] {
124 set orig_syms
[run_host_cmd $nm $testfile
]
125 set syms_massaged $orig_syms
126 switch -regexp $target_triplet
{
127 ^mmix
-knuth
-mmixware$
{
128 # Without section sizes
(stripped together with the
129 # contents
for this target
), we can
't deduce the symbol
130 # types. Artificially tracking the symbol types is
131 # considered not worthwhile as there's no known use
-case
132 #
for --extract
-symbols
for this target. The option is
133 # supported just enough to emit the same symbol
values,
134 # but absolute symbol types are expected.
135 regsub
-all
" \[TD\] " $syms_massaged " A " syms_massaged
138 # This test cannot proceed
any further
for MIPS targets.
139 # The extract_syms operation produces a binary with a zero
140 # length .reginfo section
, which is illegal under the MIPS
141 # ABI. Since producing such sections is part of the expected
142 # behaviour of
--extract
-symbols
, no further testing can be
143 # performed. Fortunately this should not matter as extracting
144 # symbols is only needed
for VxWorks support.
149 # Fails
for PE based targets because the extracted section
150 # relative symbols
(eg tred or .
text) all become undefined
151 # when the sections are blown away by
--extract
-symbol. Again
152 # this should not matter as
--extract
-symbol is only used by
157 # More PE variations...
168 set extract_syms
[run_host_cmd $nm $copyfile
]
169 if ![string equal $syms_massaged $extract_syms
] {
174 # Check that the stripped section contains no code or data.
175 set exec_output
[run_host_cmd $size $copyfile
]
176 if ![regexp
".* 0\[ \]+0\[ \]+0\[ \]+0\[ \]+0\[ \]+.*" $exec_output] {
184 # PE targets need to
set the image base to
0 to avoid complications from nm.
186 if {[istarget
"*-*-pe*"] \
187 ||
[istarget
"*-*-cygwin*"] \
188 ||
[istarget
"*-*-mingw*"] \
189 ||
[istarget
"*-*-winnt*"] \
190 ||
[istarget
"*-*-nt"] \
191 ||
[istarget
"*-*-interix*"] } then {
192 set flags
"--image-base 0"
195 if ![ld_simple_link $
ld tmpdir
/script
"$flags -T $srcdir/$subdir/script.t tmpdir/script.o"] {
201 set testname
"MRI script"
203 if ![ld_simple_link $
ld tmpdir
/script
"$flags -c $srcdir/$subdir/scriptm.t"] {
209 set testname
"MEMORY"
211 if ![ld_simple_link $
ld tmpdir
/script
"$flags -T $srcdir/$subdir/memory.t tmpdir/script.o"] {
217 set testname
"MEMORY with symbols"
218 if ![ld_simple_link $
ld tmpdir
/script
"$flags -defsym DATA_ORIGIN=0x1000 -defsym DATA_LENGTH=0x10000 -T $srcdir/$subdir/memory_sym.t tmpdir/script.o"] {
220 untested
"extract symbols"
223 extract_symbol_test tmpdir
/script
"extract symbols"
226 set test_script_list
[lsort
[glob $srcdir
/$subdir
/region
-alias
-*.t
]]
228 foreach test_script $test_script_list
{
229 run_dump_test
[string range $test_script
0 end
-2]
232 run_dump_test
"align-with-input"