1 # Test NOCROSSREFS in a linker script.
2 # By Ian Lance Taylor
, Cygnus Support.
3 # Copyright
(C
) 2000-2023 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 { ![check_compiler_available
] } {
41 # Pass
-fplt to CC since
-fno
-plt doesn
't work with NOCROSSREFS tests.
42 # Also add $NOPIE_CFLAGS since PIE doesn't work NOCROSSREFS tests.
43 set old_CFLAGS
"$CFLAGS_FOR_TARGET"
44 append CFLAGS_FOR_TARGET
" $PLT_CFLAGS $NOPIE_CFLAGS"
46 # Xtensa targets currently default to putting literal
values in a separate
47 # section and that requires linker script support
, so put literals in
text.
48 if [istarget xtensa
*-*-*] {
49 append CFLAGS_FOR_TARGET
" -mtext-section-literals"
52 # Prevent the use of the MeP
's small data area which references a symbol
53 # called __sdabase which will not be defined by our test linker scripts.
54 if [istarget mep*-*-elf] {
55 append CFLAGS_FOR_TARGET " -mtiny=0"
58 # The .dsbt section and __c6xabi_DSBT_BASE are not defined in our test
60 if [istarget tic6x*-*-*] {
61 append CFLAGS_FOR_TARGET " -mno-dsbt -msdata=none"
64 if { ![ld_compile "$CC_FOR_TARGET $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" "$srcdir/$subdir/cross1.c" tmpdir/cross1.o] \
65 || ![ld_compile "$CC_FOR_TARGET $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" "$srcdir/$subdir/cross2.c" tmpdir/cross2.o] } {
68 set CFLAGS_FOR_TARGET "$old_CFLAGS"
72 set flags [big_or_little_endian]
74 # arc-elf32 requires the symbol __SDATA_BEGIN__ to always be present.
75 if [istarget arc*-*-elf32] {
76 append flags " --defsym __SDATA_BEGIN__=0"
79 if [is_pecoff_format] {
80 append flags " --image-base 0"
83 set exec_output [run_host_cmd "$ld" "$flags -o tmpdir/cross1 -T $srcdir/$subdir/cross1.t tmpdir/cross1.o tmpdir/cross2.o --no-error-rwx-segments"]
85 set exec_output [prune_warnings $exec_output]
87 regsub -all "(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
89 if [string match "" $exec_output] then {
92 verbose -log "$exec_output"
93 if [regexp "prohibited cross reference from .* to `.*foo' in
" $exec_output] {
100 # Check cross references within a single object.
102 if { ![ld_compile
"$CC_FOR_TARGET $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" "$srcdir/$subdir/cross3.c" tmpdir/cross3.o] } {
104 set CFLAGS_FOR_TARGET
"$old_CFLAGS"
108 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross2 -T $srcdir/$subdir/cross2.t tmpdir/cross3.o --no-error-rwx-segments"]
109 set exec_output
[prune_warnings $exec_output
]
111 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
113 if [string match
"" $exec_output] then {
116 verbose
-log "$exec_output"
117 if [regexp
"prohibited cross reference from .* to `.*' in" $exec_output] {
124 # Check cross references
for ld -r
126 if { ![ld_compile
"$CC_FOR_TARGET $NOSANITIZE_CFLAGS $NOLTO_CFLAGS" "$srcdir/$subdir/cross4.c" tmpdir/cross4.o] } {
128 set CFLAGS_FOR_TARGET
"$old_CFLAGS"
132 if ![ld_relocate $
ld tmpdir
/cross3
-partial.o
"tmpdir/cross1.o tmpdir/cross4.o"] {
134 set CFLAGS_FOR_TARGET
"$old_CFLAGS"
138 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross3 -T $srcdir/$subdir/cross3.t tmpdir/cross3-partial.o tmpdir/cross2.o --no-error-rwx-segments"]
140 set exec_output
[prune_warnings $exec_output
]
142 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
144 if [string match
"" $exec_output] then {
147 verbose
-log "$exec_output"
151 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross4 -T $srcdir/$subdir/cross4.t tmpdir/cross4.o --no-error-rwx-segments"]
152 set exec_output
[prune_warnings $exec_output
]
154 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
156 if [string match
"" $exec_output] then {
159 verbose
-log "$exec_output"
163 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross5 -T $srcdir/$subdir/cross5.t tmpdir/cross4.o --no-error-rwx-segments"]
164 set exec_output
[prune_warnings $exec_output
]
166 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
168 if [string match
"" $exec_output] then {
171 verbose
-log "$exec_output"
172 if [regexp
"prohibited cross reference from .* to `.*' in" $exec_output] {
179 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross6 -T $srcdir/$subdir/cross6.t tmpdir/cross3.o --no-error-rwx-segments"]
180 set exec_output
[prune_warnings $exec_output
]
182 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
184 if [string match
"" $exec_output] then {
187 verbose
-log "$exec_output"
191 set exec_output
[run_host_cmd
"$ld" "$flags -o tmpdir/cross7 -T $srcdir/$subdir/cross7.t tmpdir/cross3.o --no-error-rwx-segments"]
192 set exec_output
[prune_warnings $exec_output
]
194 regsub
-all
"(^|\n)($ld: warning: cannot find entry symbol\[^\n\]*\n?)" $exec_output "\\1" exec_output
196 if [string match
"" $exec_output] then {
199 verbose
-log "$exec_output"
200 if [regexp
"prohibited cross reference from .* to `.*' in" $exec_output] {
207 set CFLAGS_FOR_TARGET
"$old_CFLAGS"