]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/testsuite/ld-scripts/script.exp
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / ld / testsuite / ld-scripts / script.exp
CommitLineData
252b5132
RH
1# Test basic linker script functionality
2# By Ian Lance Taylor, Cygnus Support
250d07de 3# Copyright (C) 1999-2021 Free Software Foundation, Inc.
a2b64bed 4#
f96b4a7b
NC
5# This file is part of the GNU Binutils.
6#
7# This program is free software; you can redistribute it and/or modify
a2b64bed 8# it under the terms of the GNU General Public License as published by
f96b4a7b 9# the Free Software Foundation; either version 3 of the License, or
a2b64bed 10# (at your option) any later version.
f96b4a7b 11#
a2b64bed
NC
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.
f96b4a7b 16#
a2b64bed
NC
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
f96b4a7b
NC
19# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20# MA 02110-1301, USA.
252b5132
RH
21
22set testname "script"
23
24if ![ld_assemble $as $srcdir/$subdir/script.s tmpdir/script.o] {
25 unresolved $testname
26 return
27}
28
29proc check_script { } {
30 global nm
31 global testname
32 global nm_output
33
992c450d 34 if ![ld_nm $nm "" tmpdir/script] {
348fe36b 35 fail $testname
3ec57632
NC
36 return
37 }
38
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"
45 fail $testname
46 return
47 }
48
49 set passes 1
50 set text_end 0x104
51 set data_end 0x1004
52
53 if [istarget *c4x*-*-*] then {
54 set text_end 0x101
55 set data_end 0x1001
56 }
57
58 if [istarget *c54x*-*-*] then {
59 set text_end 0x102
60 set data_end 0x1002
61 }
62
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)"
66 set passes 0
67 }
68
cc9ad334 69 if {[info exists nm_output(tred)] \
39a7b38f 70 && $nm_output(tred) != (0x100 + 0x4000)} {
cc9ad334
SKS
71 send_log "tred == $nm_output(tred)\n"
72 verbose "tred == $nm_output(tred)"
73 set passes 0
74 }
75
3ec57632
NC
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)"
80 set passes 0
81 }
82
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)"
86 set passes 0
87 }
88
cc9ad334 89 if {[info exists nm_output(fred)] \
39a7b38f 90 && $nm_output(fred) != (0x1000 + 0x1000)} {
cc9ad334
SKS
91 send_log "fred == $nm_output(fred)\n"
92 verbose "fred == $nm_output(fred)"
93 set passes 0
94 }
95
3ec57632
NC
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)"
100 set passes 0
101 }
102
103 if { $passes } {
104 pass $testname
252b5132 105 } else {
3ec57632 106 fail $testname
252b5132
RH
107 }
108}
109
7b19bec2
AM
110proc extract_symbol_test { testfile testname } {
111 global objcopy
112 global nm
113 global size
282b7d7b 114 global target_triplet
7b19bec2
AM
115
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] {
120 fail $testname
121 return
122 }
123
124 set orig_syms [run_host_cmd $nm $testfile]
282b7d7b
HPN
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
136 }
13ce3603
NC
137 ^mips-*-* {
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.
145 pass $testname
146 return
147 }
fdbd3e95
NC
148 [a-z]*-*-pe$ {
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
153 # VxWorks.
154 pass $testname
155 return
156 }
8dc483a0
NC
157 # More PE variations...
158 [a-z]*-*-mingw* {
159 pass $testname
160 return
161 }
162 [a-z]*-*-cygwin$ {
163 pass $testname
164 return
165 }
282b7d7b
HPN
166 }
167
7b19bec2 168 set extract_syms [run_host_cmd $nm $copyfile]
282b7d7b 169 if ![string equal $syms_massaged $extract_syms] {
7b19bec2
AM
170 fail $testname
171 return
172 }
173
13ce3603 174 # Check that the stripped section contains no code or data.
7b19bec2
AM
175 set exec_output [run_host_cmd $size $copyfile]
176 if ![regexp ".* 0\[ \]+0\[ \]+0\[ \]+0\[ \]+0\[ \]+.*" $exec_output] {
177 fail $testname
178 return
179 }
180
181 pass $testname
182}
183
777690b6 184# PE targets need to set the image base to 0 to avoid complications from nm.
231b7382
AM
185set old_LDFLAGS $LDFLAGS
186if { [is_pecoff_format] } then {
740341b9 187 append LDFLAGS " --image-base 0"
e553d5b2 188} elseif { [is_xcoff_format] } then {
740341b9 189 append LDFLAGS " -bnogc"
777690b6 190}
740341b9 191set flags $LDFLAGS
777690b6 192
d9816402 193if ![ld_link $ld tmpdir/script "$flags -T $srcdir/$subdir/script.t tmpdir/script.o"] {
252b5132
RH
194 fail $testname
195} else {
196 check_script
197}
198
199set testname "MRI script"
200
d9816402 201if ![ld_link $ld tmpdir/script "$flags -c $srcdir/$subdir/scriptm.t"] {
252b5132
RH
202 fail $testname
203} else {
204 check_script
205}
3ec57632
NC
206
207set testname "MEMORY"
208
d9816402 209if ![ld_link $ld tmpdir/script "$flags -T $srcdir/$subdir/memory.t tmpdir/script.o"] {
3ec57632
NC
210 fail $testname
211} else {
212 check_script
213}
4a93e180 214
cc9ad334 215set testname "MEMORY with symbols"
39a7b38f 216if ![ld_link $ld tmpdir/script "$flags -defsym DATA_ORIGIN=0x1000 -defsym DATA_LENGTH=0x1000 -T $srcdir/$subdir/memory_sym.t tmpdir/script.o"] {
cc9ad334 217 fail $testname
7b19bec2 218 untested "extract symbols"
cc9ad334
SKS
219} else {
220 check_script
7b19bec2 221 extract_symbol_test tmpdir/script "extract symbols"
cc9ad334
SKS
222}
223
4287f8de 224set test_script_list [lsort [glob $srcdir/$subdir/region-alias-*.t]]
4a93e180
NC
225
226foreach test_script $test_script_list {
9933d191 227 run_dump_test [string range $test_script 0 end-2]
4a93e180 228}
1eec346e 229
9933d191 230run_dump_test "align-with-input"
42b7a39b 231run_dump_test "pr20302"
6057dc97
MR
232
233run_dump_test "segment-start" {{name (default)}}
234run_dump_test "segment-start" {{name (overridden)} \
235 {ld -Ttext-segment=0x10000000}}
231b7382
AM
236
237set LDFLAGS $old_LDFLAGS