1 # Test NOCROSSREFS in a linker script.
2 # By Ian Lance Taylor
, Cygnus Support.
3 # Copyright
(C
) 2000-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
,
22 set test1
"NOCROSSREFS 1"
23 set test2
"NOCROSSREFS 2"
24 set test3
"NOCROSSREFS 3"
25 set test4
"NOCROSSREFS_TO 1"
26 set test5
"NOCROSSREFS_TO 2"
27 set test6
"NOCROSSREFS_TO 3"
28 set test7
"NOCROSSREFS_TO 4"
30 if { ![is_remote host
] && [which $CC
] == 0 } {
42 set old_CFLAGS
"$CFLAGS"
44 # Pass
-fplt to CC since
-fno
-plt doesn
't work with NOCROSSREFS tests.
47 set CC "$CC $PLT_CFLAGS"
49 # Xtensa targets currently default to putting literal values in a separate
50 # section and that requires linker script support, so put literals in text.
51 if [istarget xtensa*-*-*] {
52 set CFLAGS "$CFLAGS -mtext-section-literals"
55 # Prevent the use of the MeP's small data area which references a symbol
56 # called __sdabase which will not be defined by our test linker scripts.
57 if [istarget mep
*-*-elf
] {
61 # The .dsbt section and __c6xabi_DSBT_BASE are not defined in our test
63 if [istarget tic6x
*-*-*] {
64 set CFLAGS
"-mno-dsbt -msdata=none"
67 if { ![ld_compile $CC
"$srcdir/$subdir/cross1.c" tmpdir/cross1.o] \
68 ||
![ld_compile $CC
"$srcdir/$subdir/cross2.c" tmpdir/cross2.o] } {
71 set CFLAGS
"$old_CFLAGS"
76 set flags
[big_or_little_endian
]
78 if [istarget sh64
*-*-elf
] {
79 # This is what gcc passes to
ld by default.
83 # arc
-elf32 requires the symbol __SDATA_BEGIN__ to always be present.
84 if [istarget arc
*-*-elf32
] {
85 set flags
"$flags --defsym=__SDATA_BEGIN__=0"
88 # IA64 has both ordered and unordered sections in an input file.
91 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross1 -T $srcdir/$subdir/cross1.t tmpdir/cross1.o tmpdir/cross2.o"]
93 set exec_output
[prune_warnings $exec_output
]
95 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
97 if [string match
"" $exec_output] then {
100 verbose
-log "$exec_output"
101 if [regexp
"prohibited cross reference from .* to `.*foo' in" $exec_output] {
108 # Check cross references within a single object.
110 if { ![ld_compile $CC
"$srcdir/$subdir/cross3.c" tmpdir/cross3.o] } {
112 set CFLAGS
"$old_CFLAGS"
117 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross2 -T $srcdir/$subdir/cross2.t tmpdir/cross3.o"]
118 set exec_output
[prune_warnings $exec_output
]
120 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
122 if [string match
"" $exec_output] then {
125 verbose
-log "$exec_output"
126 if [regexp
"prohibited cross reference from .* to `.*' in" $exec_output] {
133 # Check cross references
for ld -r
135 if { ![ld_compile $CC
"$srcdir/$subdir/cross4.c" tmpdir/cross4.o] } {
137 set CFLAGS
"$old_CFLAGS"
142 if ![ld_relocate $
ld tmpdir
/cross3
-partial.o
"tmpdir/cross1.o tmpdir/cross4.o"] {
144 set CFLAGS
"$old_CFLAGS"
149 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross3 -T $srcdir/$subdir/cross3.t tmpdir/cross3-partial.o tmpdir/cross2.o"]
151 set exec_output
[prune_warnings $exec_output
]
153 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
155 if [string match
"" $exec_output] then {
158 verbose
-log "$exec_output"
162 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross4 -T $srcdir/$subdir/cross4.t tmpdir/cross4.o"]
163 set exec_output
[prune_warnings $exec_output
]
165 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
167 if [string match
"" $exec_output] then {
170 verbose
-log "$exec_output"
174 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross5 -T $srcdir/$subdir/cross5.t tmpdir/cross4.o"]
175 set exec_output
[prune_warnings $exec_output
]
177 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
179 if [string match
"" $exec_output] then {
182 verbose
-log "$exec_output"
183 if [regexp
"prohibited cross reference from .* to `.*' in" $exec_output] {
190 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross6 -T $srcdir/$subdir/cross6.t tmpdir/cross3.o"]
191 set exec_output
[prune_warnings $exec_output
]
193 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
195 if [string match
"" $exec_output] then {
198 verbose
-log "$exec_output"
202 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross7 -T $srcdir/$subdir/cross7.t tmpdir/cross3.o"]
203 set exec_output
[prune_warnings $exec_output
]
205 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
207 if [string match
"" $exec_output] then {
210 verbose
-log "$exec_output"
211 if [regexp
"prohibited cross reference from .* to `.*' in" $exec_output] {
218 set CFLAGS
"$old_CFLAGS"