* binutils-all/objcopy.exp (strip_test, strip_executable):
[deliverable/binutils-gdb.git] / binutils / testsuite / binutils-all / objcopy.exp
CommitLineData
aef6203b 1# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
8c5fc800 2# 2004, 2006, 2007, 2009, 2010, 2011
8c2bc687 3# Free Software Foundation, Inc.
252b5132
RH
4
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
32866df7 7# the Free Software Foundation; either version 3 of the License, or
252b5132
RH
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program; if not, write to the Free Software
b43b5d5f 17# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
252b5132
RH
18
19# Please email any bugs, comments, and/or additions to this file to:
20# bug-dejagnu@prep.ai.mit.edu
21
22# Written by Ian Lance Taylor <ian@cygnus.com>
23
24if ![is_remote host] {
25 if {[which $OBJCOPY] == 0} then {
26 perror "$OBJCOPY does not exist"
27 return
28 }
29}
30
31send_user "Version [binutil_version $OBJCOPY]"
32
252b5132 33if ![is_remote host] {
8d263650
BE
34 set tempfile tmpdir/bintest.o
35 set copyfile tmpdir/copy
252b5132
RH
36} else {
37 set tempfile [remote_download host tmpdir/bintest.o]
38 set copyfile copy
39}
40
41# Test that objcopy does not modify a file when copying it.
42
64bb95af
L
43proc objcopy_test {testname srcfile} {
44 global OBJCOPY
45 global OBJCOPYFLAGS
46 global srcdir
47 global subdir
48 global tempfile
49 global copyfile
252b5132 50
64bb95af
L
51 if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
52 perror "unresolved $testname"
53 unresolved "objcopy ($testname)"
54 return
252b5132 55 }
252b5132 56
64bb95af
L
57 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $tempfile ${copyfile}.o"]
58
59 if ![string match "" $got] then {
60 fail "objcopy ($testname)"
252b5132 61 } else {
64bb95af
L
62 send_log "cmp $tempfile ${copyfile}.o\n"
63 verbose "cmp $tempfile ${copyfile}.o"
64 if [is_remote host] {
65 set src1 tmpdir/bintest.o
66 set src2 tmpdir/copy.o
67 remote_upload host $tempfile $src1
68 remote_upload host ${copyfile}.o $src2
69 } else {
70 set src1 ${tempfile}
71 set src2 ${copyfile}.o
72 }
73 set status [remote_exec build cmp "${src1} ${src2}"]
74 set exec_output [lindex $status 1]
75 set exec_output [prune_warnings $exec_output]
76
77 # On some systems the result of objcopy will not be identical.
78 # Usually this is just because gas isn't using bfd to write the
79 # files in the first place, and may order things a little
80 # differently. Those systems should use setup_xfail here.
81
4cd28456 82 setup_xfail "h8300-*-coff"
64bb95af
L
83 setup_xfail "h8500-*-rtems*" "h8500-*-coff"
84 setup_xfail "hppa*-*-*"
85 setup_xfail "i960-*"
86 setup_xfail "m68*-*-*coff" "m68*-*-hpux*" "m68*-*-lynxos*"
87 setup_xfail "m68*-*-sysv*" "m68*-apple-aux*"
88 setup_xfail "m8*-*"
89 setup_xfail "or32-*-rtems*" "or32-*-coff"
b0a0c50a
AM
90 setup_xfail "sh-*-coff*"
91 setup_xfail "tic80-*-*" "w65-*"
64bb95af
L
92
93 clear_xfail "hppa*64*-*-hpux*" "hppa*-*-linux*" "hppa*-*-lites*"
94 clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-rtems*" "*-*-*elf*"
95 clear_xfail "m68*-*-sysv4*"
96
97 if [string match "" $exec_output] then {
98 pass "objcopy ($testname)"
99 } else {
100 send_log "$exec_output\n"
101 verbose "$exec_output" 1
252b5132 102
64bb95af
L
103 # On OSF/1, this succeeds with gas and fails with /bin/as.
104 setup_xfail "alpha*-*-osf*"
252b5132 105
64bb95af
L
106 fail "objcopy ($testname)"
107 }
252b5132
RH
108 }
109}
110
64bb95af
L
111objcopy_test "simple copy" bintest.s
112
9e48b4c6
NC
113# Test reversing bytes in a section.
114
115set reversed ${tempfile}-reversed
116set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j .data --reverse-bytes=4 $tempfile $reversed"]
117
118if ![string match "" $got] then {
119 fail "objcopy --reverse-bytes"
120} else {
121 if [is_remote host] {
122 remote_upload host ${reversed} tmpdir/copy-reversed.o
123 set reversed tmpdir/copy-reversed.o
124 }
125
126 set origdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $tempfile"]
127 set revdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $reversed"]
128
129 set want "^ \[0-9\]+ (\[0-9\]+)"
130 set found_orig [regexp -lineanchor $want $origdata -> origdata]
131 set found_rev [regexp -lineanchor $want $revdata -> revdata]
132
133 if {$found_orig == 0 || $found_rev == 0} then {
8941d5e8
DA
134 # som doesn't have a .data section
135 setup_xfail "hppa*-*-hpux*"
136 clear_xfail "hppa*64*-*-hpux*"
137
9e48b4c6
NC
138 fail "objcopy --reverse-bytes"
139 } else {
140 scan $origdata "%2x%2x%2x%2x" b1 b2 b3 b4
141 scan $revdata "%2x%2x%2x%2x" c4 c3 c2 c1
142
143 if {$b1 == $c1 && $b2 == $c2 && $b3 == $c3 && $b4 == $c4} then {
144 pass "objcopy --reverse-bytes"
145 } else {
146 fail "objcopy --reverse-bytes"
147 }
148 }
149}
150
b7dd81f7
NC
151# Test interleaved copy of multiple byte width
152
153set sequence_file sequence_file
154set file [open ${sequence_file} w]
155puts ${file} "12345678"
156close ${file}
157
158if [is_remote host] {
159 remote_upload host ${sequence_file} tmpdir/sequence_file
160 set sequence_file tmpdir/sequence_file
161}
162
163set got [binutils_run $OBJCOPY "-I binary -i 4 -b 0 --interleave-width 2 ${sequence_file} ${copyfile}"]
164
165if ![string match "" $got] then {
166 fail "objcopy -i --interleave-width"
167} else {
168 if [is_remote host] {
169 remote_upload host ${copyfile} tmpdir/interleave_output
170 set interleave_output tmpdir/interleave_output
171 } else {
172 set interleave_output ${copyfile}
173 }
174
175 set file [open ${interleave_output} r]
176 gets $file line
177 send_log "$line\n"
178 verbose $line
179
180 if ![string match "1256" $line] then {
181 fail "objcopy -i --interleave-width"
182 }
183 pass "objcopy -i --interleave-width"
184
185 close $file
186}
187
252b5132
RH
188# Test generating S records.
189
190# We make the srec filename 8.3 compatible. Note that the header string
191# matched against depends on the name of the file. Ugh.
192
193if [is_remote host] {
194 set srecfile copy.sre
195 set header_string S00B0000636F70792E737265C1
196} else {
197 set srecfile ${copyfile}.srec
198 set header_string S0130000746D706469722F636F70792E7372656397
199}
200
201set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"]
202
203if ![string match "" $got] then {
204 fail "objcopy -O srec"
205} else {
206 if [is_remote host] {
8d263650
BE
207 remote_upload host ${srecfile} tmpdir/copy.srec
208 set srecfile tmpdir/copy.srec
252b5132
RH
209 }
210 set file [open ${srecfile} r]
211
212 # The first S record is fixed by the file name we are using.
213 gets $file line
214 send_log "$line\n"
215 verbose $line
216 if ![regexp "$header_string.*" $line] {
217 send_log "bad header\n"
218 fail "objcopy -O srec"
219 } else {
220 while {[gets $file line] != -1 \
221 && [regexp "^S\[123\]\[0-9a-fA-F\]+\[\r\n\]*$" $line]} {
222 send_log "$line\n"
223 verbose $line
224 set line "**EOF**"
225 }
226 send_log "$line\n"
227 verbose $line
228 if ![regexp "^S\[789\]\[0-9a-fA-F\]+\[\r\n\]*$" $line] then {
229 send_log "bad trailer\n"
230 fail "objcopy -O srec"
231 } else {
232 if {[gets $file line] != -1} then {
233 send_log "garbage at end\n"
234 send_log "$line\n"
235 verbose $line
236 fail "objcopy -O srec"
237 } else {
7f6a71ff 238 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${srecfile}"]
252b5132
RH
239 if ![regexp "file format srec" $got] then {
240 send_log "objdump failed\n"
241 fail "objcopy -O srec"
242 } else {
243 pass "objcopy -O srec"
244 }
245 }
246 }
247 }
248
249 close $file
250}
251
252# Test setting and adjusting the start address. We only test this
253# while generating S records, because we may not be able to set the
254# start address for other object file formats, and the S record case
255# is the only useful one anyhow.
256
257set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $tempfile"]
258if ![regexp "start address (\[0-9a-fA-FxX\]+)" $got all origstart] then {
259 perror "objdump can not recognize bintest.o"
260 set origstart ""
261} else {
627fe3fb 262 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --set-start 0x7654 $tempfile ${copyfile}.srec"]
252b5132
RH
263 if ![string match "" $got] then {
264 fail "objcopy --set-start"
265 } else {
266 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
267 if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
268 fail "objcopy --set-start"
269 } else {
270 if {$srecstart != 0x7654} then {
271 send_log "$srecstart != 0x7654\n"
272 fail "objcopy --set-start"
273 } else {
274 pass "objcopy --set-start"
275 }
276 }
277 }
278
627fe3fb 279 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-start 0x123 $tempfile ${copyfile}.srec"]
252b5132
RH
280 if ![string match "" $got] then {
281 fail "objcopy --adjust-start"
282 } else {
283 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
284 if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
285 fail "objcopy --adjust-start"
286 } else {
287 if {$srecstart != $origstart + 0x123} then {
288 send_log "$srecstart != $origstart + 0x123\n"
289 fail "objcopy --adjust-start"
290 } else {
291 pass "objcopy --adjust-start"
292 }
293 }
294 }
295}
296
297# Test adjusting the overall VMA, and adjusting the VMA of a
298# particular section. We again only test this when generating S
299# records.
300
301set low ""
302set lowname ""
303
304set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"]
305
306set headers_regexp "\[ 0-9\]+(\[^ \]+)\[ \]*(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+2\[*\]\[*\]\[0-9\]+(.*)"
307
308set got $headers
309while {[regexp $headers_regexp $got all name size vma rest]} {
310 set vma 0x$vma
311 set size 0x$size
312 if {$size != 0} {
313 if {$low == "" || $vma < $low} {
314 set low $vma
315 set lowname $name
316 }
317 }
318 set got $rest
319}
320
321if {$low == "" || $origstart == ""} then {
322 perror "objdump can not recognize bintest.o"
323} else {
627fe3fb 324 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-vma 0x123 $tempfile ${copyfile}.srec"]
252b5132
RH
325 if ![string match "" $got] then {
326 fail "objcopy --adjust-vma"
327 } else {
328 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -fh ${copyfile}.srec"]
329 set want "file format srec.*start address\[ \]*(\[0-9a-fA-FxX\]+).*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
330 if ![regexp $want $got all start vma] then {
331 fail "objcopy --adjust-vma"
332 } else {
333 set vma 0x$vma
334 if {$vma != $low + 0x123} then {
335 send_log "$vma != $low + 0x123\n"
336 fail "objcopy --adjust-vma"
337 } else {
338 if {$start != $origstart + 0x123} then {
339 send_log "$start != $origstart + 0x123\n"
340 fail "objcopy --adjust-vma"
341 } else {
342 pass "objcopy --adjust-vma"
343 }
344 }
345 }
346 }
347
348 set arg ""
349 set got $headers
350 while {[regexp $headers_regexp $got all name size vma rest]} {
351 set vma 0x$vma
352 if {$vma == $low} then {
353 set arg "$arg --adjust-section-vma $name+4"
354 }
355 set got $rest
356 }
357
627fe3fb 358 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $arg $tempfile ${copyfile}.srec"]
252b5132
RH
359 if ![string match "" $got] then {
360 fail "objcopy --adjust-section-vma +"
361 } else {
362 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
363 set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
364 if ![regexp $want $got all vma] then {
365 fail "objcopy --adjust-section-vma +"
366 } else {
367 set vma 0x$vma
368 if {$vma != $low + 4} then {
369 send_log "$vma != $low + 4\n"
370 fail "objcopy --adjust-section-vma +"
371 } else {
372 pass "objcopy --adjust-section-vma +"
373 }
374 }
375 }
376
377 regsub -all "\\+4" $arg "=[expr $low + 4]" argeq
627fe3fb 378 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $argeq $tempfile ${copyfile}.srec"]
252b5132
RH
379 if ![string match "" $got] then {
380 fail "objcopy --adjust-section-vma ="
381 } else {
382 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
383 set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
384 if ![regexp $want $got all vma] then {
385 fail "objcopy --adjust-section-vma ="
386 } else {
387 set vma 0x$vma
388 if {$vma != $low + 4} then {
389 send_log "$vma != $low + 4\n"
390 fail "objcopy --adjust-section-vma ="
391 } else {
392 pass "objcopy --adjust-section-vma ="
393 }
394 }
395 }
396}
397
398# Test stripping an object.
399
400proc strip_test { } {
1983fbac 401 global AR
252b5132
RH
402 global CC
403 global STRIP
404 global STRIPFLAGS
405 global NM
406 global NMFLAGS
407 global srcdir
408 global subdir
28902555 409 global READELF
252b5132
RH
410
411 set test "strip"
412
413 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
414 untested $test
415 return
416 }
417
28902555
BS
418 set osabi_fail "false"
419 if [is_elf_format] {
420 verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.in"
421 set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.in"]
422 if { [lindex $exec_output 0] != 0 } then {
423 unresolved "$test preserving OS/ABI"
424 set osabi_fail "true"
425 } else {
426 verbose -log "grep OS/ABI tmpdir/osabi.in"
427 catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
428 }
429 }
430
252b5132 431 if [is_remote host] {
1983fbac 432 set archive libstrip.a
8d263650 433 set objfile [remote_download host tmpdir/testprog.o]
1983fbac
L
434 remote_file host delete $archive
435 } else {
436 set archive tmpdir/libstrip.a
437 set objfile tmpdir/testprog.o
438 }
439
440 remote_file build delete tmpdir/libstrip.a
441
442 set exec_output [binutils_run $AR "rc $archive ${objfile}"]
443 if ![string match "" $exec_output] {
444 fail $test
28902555 445 unresolved "$test preserving OS/ABI"
1983fbac
L
446 return
447 }
448
8648f88f
L
449 set exec_output [binutils_run $STRIP "-g $archive"]
450 if ![string match "" $exec_output] {
451 fail $test
28902555 452 unresolved "$test preserving OS/ABI"
8648f88f
L
453 return
454 }
455
1983fbac
L
456 set exec_output [binutils_run $STRIP "$STRIPFLAGS $archive"]
457 if ![string match "" $exec_output] {
458 fail $test
28902555 459 unresolved "$test preserving OS/ABI"
1983fbac
L
460 return
461 }
462
28902555
BS
463 if { $osabi_fail != "true" && [is_elf_format] } {
464 verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.out"
465 set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.out"]
466 if { [lindex $exec_output 0] != 0 } then {
467 unresolved "$test preserving OS/ABI"
468 } else {
469 verbose -log "grep OS/ABI tmpdir/osabi.out"
470 catch "exec grep OS/ABI tmpdir/osabi.out" osabi_out
471 if { "$osabi_in" == "$osabi_out" } {
472 pass "$test preserving OS/ABI"
473 } else {
474 fail "$test preserving OS/ABI"
475 }
476 }
477 }
478
1983fbac
L
479 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
480 untested $test
481 return
482 }
483
484 if [is_remote host] {
8d263650 485 set objfile [remote_download host tmpdir/testprog.o]
252b5132
RH
486 } else {
487 set objfile tmpdir/testprog.o
488 }
489
490 set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"]
491 if ![string match "" $exec_output] {
492 fail $test
493 return
494 }
495
496 set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"]
68a4c073 497 if ![string match "*: no symbols*" $exec_output] {
252b5132
RH
498 fail $test
499 return
500 }
501
502 pass $test
503}
504
505strip_test
506
507# Test stripping an object file with saving a symbol
508
509proc strip_test_with_saving_a_symbol { } {
510 global CC
511 global STRIP
512 global STRIPFLAGS
513 global NM
514 global NMFLAGS
515 global srcdir
516 global subdir
517
518 set test "strip with saving a symbol"
519
520 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
521 untested $test
522 return
523 }
524
525 if [is_remote host] {
8d263650 526 set objfile [remote_download host tmpdir/testprog.o]
252b5132
RH
527 } else {
528 set objfile tmpdir/testprog.o
529 }
530
531 set exec_output [binutils_run $STRIP "$STRIPFLAGS -K main -K _main $objfile"]
532 if ![string match "" $exec_output] {
533 fail $test
534 return
535 }
536
537 set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
195fe636 538 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
252b5132
RH
539 && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} {
540 fail $test
541 return
542 }
543
544 pass $test
545}
546
547strip_test_with_saving_a_symbol
548
549# Build a final executable.
550
99ad8390 551if { [istarget *-*-cygwin] || [istarget *-*-mingw*] } {
f8a7038a
NC
552 set test_prog "testprog.exe"
553} else {
554 set test_prog "testprog"
555}
556
252b5132
RH
557proc copy_setup { } {
558 global srcdir
559 global subdir
9a580d9a 560 global gcc_gas_flag
f8a7038a 561 global test_prog
72d4c02f 562 global host_triplet
252b5132 563
8d263650
BE
564 set res [build_wrapper testglue.o]
565 set flags { debug }
252b5132 566
28902555 567 if { [istarget *-*-uclinux*] && ![istarget tic6x-*-*] } {
903b1f5b
NS
568 return 1
569 }
570
252b5132 571 if { $res != "" } {
8d263650
BE
572 lappend flags "additional_flags=[lindex $res 1]"
573 set add_libs "testglue.o"
252b5132 574 } else {
8d263650 575 set add_libs ""
252b5132
RH
576 }
577
5940a93c
TS
578 if { [istarget *-*-linux*]
579 || [istarget *-*-gnu*] } {
9a580d9a
L
580 foreach i $gcc_gas_flag {
581 set flags "additional_flags=$i $flags"
582 }
583 }
f8a7038a 584 if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/$test_prog executable $flags] != "" } {
252b5132
RH
585 return 2
586 }
587
8d263650
BE
588 set result [remote_load target tmpdir/$test_prog]
589 set status [lindex $result 0]
252b5132
RH
590
591 if { $status != "pass" } {
72d4c02f
KT
592 send_log "cannot run executable, status = ${status} on ${host_triplet}\n"
593 if { [istarget $host_triplet] } {
594 return 3
595 }
596 set status "pass"
252b5132
RH
597 }
598
599 return 0
600}
601
602# Test copying an executable.
603
604proc copy_executable { prog flags test1 test2 } {
f8a7038a 605 global test_prog
72d4c02f 606 global host_triplet
252b5132
RH
607
608 if [is_remote host] {
8d263650 609 set testfile [remote_download host tmpdir/$test_prog]
252b5132
RH
610 set testcopy copyprog
611 } else {
f8a7038a 612 set testfile tmpdir/$test_prog
252b5132
RH
613 set testcopy tmpdir/copyprog
614 }
8d263650 615 remote_file host delete $testcopy
252b5132
RH
616
617 set exec_output [binutils_run $prog "$flags $testfile $testcopy"]
618
619 if ![string match "" $exec_output] {
620 fail $test1
0d063f63
AM
621 if [string match "" $test2] {
622 return
623 }
252b5132
RH
624 fail $test2
625 return
626 }
627
628 if [is_remote host] {
629 remote_upload host $testcopy tmpdir/copyprog
630 }
631
f8a7038a 632 set status [remote_exec build "cmp" "tmpdir/$test_prog tmpdir/copyprog"]
8d263650 633 set exec_output [lindex $status 1]
252b5132
RH
634
635 if [string match "" $exec_output] then {
636 pass $test1
637 } else {
638 send_log "$exec_output\n"
639 verbose "$exec_output"
640
641 # This will fail for many reasons. For example, it will most
642 # likely fail if a non-GNU linker is used. Therefore, we do
643 # not insist that it pass. If you are using an assembler and
644 # linker based on the same BFD as objcopy, it is worth
645 # investigating to see why this failure occurs. If we are
646 # cross compiling, we assume that a GNU linker is being used,
647 # and expect it to succeed.
648 if {[isnative]} then {
649 setup_xfail "*-*-*"
650 }
651
652 # This also fails for mips*-*-elf targets. See elf32-mips.c
653 # mips_elf_sym_is_global.
654 setup_xfail "mips*-*-elf"
655
8c5fc800 656 setup_xfail "arm*-*-coff"
11d47adc 657 setup_xfail "arm*-*-pe"
88f14853 658 setup_xfail "*-*-mingw*"
899396fe 659 setup_xfail "*-*-cygwin*"
11d47adc 660
252b5132
RH
661 fail $test1
662 }
663
0d063f63
AM
664 if [string match "" $test2] {
665 return
666 }
667
252b5132 668 set output [remote_load target tmpdir/copyprog]
8d263650 669 set status [lindex $output 0]
72d4c02f
KT
670 if { ![istarget $host_triplet] } {
671 set status "pass"
672 }
252b5132
RH
673 if { $status != "pass" } {
674 fail $test2
675 } else {
676 pass $test2
677 }
678}
679
680# Test stripping an executable
681
682proc strip_executable { prog flags test } {
683 global NM
684 global NMFLAGS
28902555 685 global READELF
72d4c02f 686 global host_triplet
252b5132 687
0fcc17f8 688 remote_file build delete tmpdir/striprog
252b5132
RH
689 remote_download build tmpdir/copyprog tmpdir/striprog
690 if [is_remote host] {
8d263650 691 set copyfile [remote_download host tmpdir/striprog]
252b5132
RH
692 } else {
693 set copyfile tmpdir/striprog
694 }
695
28902555
BS
696 set osabi_fail "false"
697 if [is_elf_format] {
698 verbose -log "$READELF -a ${copyfile} > tmpdir/osabi.in"
699 set exec_output [remote_exec host "$READELF -h ${copyfile}" "" "/dev/null" "tmpdir/osabi.in"]
700 if { [lindex $exec_output 0] != 0 } then {
701 unresolved "$test preserving OS/ABI"
702 set osabi_fail "true"
703 } else {
704 verbose -log "grep OS/ABI tmpdir/osabi.in"
705 catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
706 }
707 }
708
252b5132
RH
709 set exec_output [binutils_run $prog "$flags ${copyfile}"]
710 if ![string match "" $exec_output] {
711 fail $test
712 return
713 }
714
715 if [is_remote host] {
8d263650 716 remote_upload host ${copyfile} tmpdir/striprog
252b5132
RH
717 }
718
719 set result [remote_load target tmpdir/striprog]
8d263650 720 set status [lindex $result 0]
72d4c02f
KT
721 if { ![istarget $host_triplet] } {
722 set status "pass"
723 }
252b5132
RH
724 if { $status != "pass" } {
725 fail $test
726 return
727 }
728
28902555
BS
729 if { $osabi_fail != "true" && [is_elf_format] } {
730 verbose -log "$READELF -a ${copyfile} > tmpdir/osabi.out"
731 set exec_output [remote_exec host "$READELF -h ${copyfile}" "" "/dev/null" "tmpdir/osabi.out"]
732 if { [lindex $exec_output 0] != 0 } then {
733 unresolved "$test preserving OS/ABI"
734 } else {
735 verbose -log "grep OS/ABI tmpdir/osabi.out"
736 catch "exec grep OS/ABI tmpdir/osabi.out" osabi_out
737 if { "$osabi_in" == "$osabi_out" } {
738 pass "$test preserving OS/ABI"
739 } else {
740 fail "$test preserving OS/ABI"
741 }
742 }
743 }
744
252b5132 745 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
68a4c073 746 if ![string match "*: no symbols*" $exec_output] {
252b5132
RH
747 fail $test
748 return
749 }
750 pass $test
751}
752
753# Test stripping an executable with saving a symbol
754
755proc strip_executable_with_saving_a_symbol { prog flags test } {
756 global NM
757 global NMFLAGS
72d4c02f 758 global host_triplet
252b5132 759
0fcc17f8 760 remote_file build delete tmpdir/striprog
252b5132
RH
761 remote_download build tmpdir/copyprog tmpdir/striprog
762 if [is_remote host] {
8d263650 763 set copyfile [remote_download host tmpdir/striprog]
252b5132
RH
764 } else {
765 set copyfile tmpdir/striprog
766 }
767
768 set exec_output [binutils_run $prog "$flags ${copyfile}"]
769 if ![string match "" $exec_output] {
770 fail $test
771 return
772 }
773
774 if [is_remote host] {
8d263650 775 remote_upload host ${copyfile} tmpdir/striprog
252b5132
RH
776 }
777
778 set result [remote_load target tmpdir/striprog]
8d263650 779 set status [lindex $result 0]
72d4c02f
KT
780 if { ![istarget $host_triplet] } {
781 set status "pass"
782 }
252b5132
RH
783 if { $status != "pass" } {
784 fail $test
785 return
786 }
787
788 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
edc45ab9
HPN
789 if { [istarget mmix-knuth-mmixware] } {
790 # Whenever there's a symbol in the mmo format, there's the symbol
791 # Main, so remove it manually from the expected output for sake of
792 # this test.
793
794 # Using "" not {} to get the \n and \r translated.
795 regsub "^\[0-9a-fA-F\]+\[ \]+T Main\[\n\r\]+" $exec_output "" exec_output
796 }
797
adacfc81
JJ
798 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
799 && ![regexp {^([0-9a-fA-F]+)?[ ]+[TD] _main} $exec_output]} {
252b5132
RH
800 fail $test
801 return
802 }
803 pass $test
804}
805
11701589
JK
806# Test keeping only debug symbols of an executable
807
808proc keep_debug_symbols_and_test_copy { prog1 flags1 test1 prog2 flags2 test2 } {
809 global NM
810 global NMFLAGS
811
0fcc17f8 812 remote_file build delete tmpdir/striprog
11701589
JK
813 remote_download build tmpdir/copyprog tmpdir/striprog
814 if [is_remote host] {
815 set copyfile [remote_download host tmpdir/striprog]
816 } else {
817 set copyfile tmpdir/striprog
818 }
819
820 set exec_output [binutils_run $prog1 "$flags1 ${copyfile}"]
821 if ![string match "" $exec_output] {
822 fail $test1
823 return
824 }
825 pass $test1
826
827 set exec_output [binutils_run $prog2 "$flags2 ${copyfile}"]
828 if ![string match "" $exec_output] {
829 fail $test2
830 return
831 }
832 pass $test2
833}
834
252b5132
RH
835set test1 "simple objcopy of executable"
836set test2 "run objcopy of executable"
837set test3 "run stripped executable"
838set test4 "run stripped executable with saving a symbol"
11701589
JK
839set test5 "keep only debug data"
840set test6 "simple objcopy of debug data"
252b5132
RH
841
842switch [copy_setup] {
843 "1" {
844 # do nothing
845 }
846 "2" {
847 untested $test1
848 untested $test2
849 untested $test3
850 untested $test4
11701589
JK
851 untested $test5
852 untested $test6
252b5132
RH
853 }
854 "3" {
0d063f63
AM
855 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" ""
856 unsupported $test2
857 unsupported $test3
858 unsupported $test4
11701589
JK
859 unsupported $test5
860 unsupported $test6
252b5132
RH
861 }
862 "0" {
863 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" "$test2"
864 strip_executable "$STRIP" "$STRIPFLAGS" "$test3"
865 strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test4"
11701589
JK
866 keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test5" \
867 "$OBJCOPY" "$OBJCOPYFLAGS" "$test6"
252b5132
RH
868 }
869}
ad2fb2cd 870
6a0d0afd
L
871proc objcopy_test_readelf {testname srcfile} {
872 global OBJCOPY
873 global OBJCOPYFLAGS
874 global READELF
875 global srcdir
876 global subdir
877
878 if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
879 unresolved "objcopy ($testname)"
880 return
881 }
882
883 verbose -log "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"
7f6a71ff
JM
884 set exec_output [remote_exec host "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"]
885 if { [lindex $exec_output 0] != 0
886 || ![string match "" [lindex $exec_output 1]] } then {
6a0d0afd 887 fail "objcopy ($testname)"
004314cc 888 return
6a0d0afd
L
889 }
890
891 verbose -log "$READELF -a tmpdir/bintest.o > tmpdir/bintest.o.out"
7f6a71ff
JM
892 set exec_output [remote_exec host "$READELF -a tmpdir/bintest.o" "" "/dev/null" "tmpdir/bintest.o.out"]
893 if { [lindex $exec_output 0] != 0 } then {
894 unresolved "objcopy ($testname)"
895 return
896 }
897 set exec_output [prune_warnings [lindex $exec_output 1]]
6a0d0afd
L
898 if ![string match "" $exec_output] then {
899 unresolved "objcopy ($testname)"
900 return
901 }
902
903 verbose -log "$READELF -a tmpdir/copy.o > tmpdir/copy.o.out"
7f6a71ff
JM
904 set exec_output [remote_exec host "$READELF -a tmpdir/copy.o" "" "/dev/null" "tmpdir/copy.o.out"]
905 if { [lindex $exec_output 0] != 0 } then {
906 unresolved "objcopy ($testname)"
907 return
908 }
909 set exec_output [prune_warnings [lindex $exec_output 1]]
6a0d0afd
L
910 if ![string match "" $exec_output] then {
911 unresolved "objcopy ($testname)"
912 return
913 }
914
915 verbose -log "diff tmpdir/bintest.o.out tmpdir/copy.o.out"
916 catch "exec diff tmpdir/bintest.o.out tmpdir/copy.o.out" exec_output
917 set exec_output [prune_warnings $exec_output]
918
919 if [string match "" $exec_output] then {
920 pass "objcopy ($testname)"
921 } else {
922 fail "objcopy ($testname)"
923 }
924}
925
ad2fb2cd
L
926# ia64 specific tests
927if { ([istarget "ia64-*-elf*"]
928 || [istarget "ia64-*-linux*"]) } {
64bb95af
L
929 objcopy_test "ia64 link order" link-order.s
930}
ad2fb2cd 931
64bb95af
L
932# ELF specific tests
933if [is_elf_format] {
934 objcopy_test "ELF unknown section type" unknown.s
6a0d0afd 935 objcopy_test_readelf "ELF group" group.s
eb3980ce 936 objcopy_test_readelf "ELF group" group-2.s
f206e905 937 objcopy_test_readelf "ELF group" group-3.s
e1e87d1e 938 objcopy_test_readelf "ELF group" group-4.s
b2fc24d4 939 run_dump_test "group-5"
85d7f0b9 940 run_dump_test "copy-1"
0930eddd 941 run_dump_test "note-1"
ad2fb2cd 942}
af3c5dea 943
af3c5dea 944run_dump_test "copy-2"
81fc501a 945run_dump_test "copy-3"
0691f7af 946run_dump_test "copy-4"
d58c2e3a
RS
947
948if [is_elf_format] {
748fc5e9
L
949 run_dump_test "strip-1"
950 run_dump_test "strip-2"
1aa9ef63 951 run_dump_test "strip-3"
eb3980ce
L
952 run_dump_test "strip-4"
953 run_dump_test "strip-5"
f206e905
L
954 run_dump_test "strip-6"
955 run_dump_test "strip-7"
e1e87d1e
L
956 run_dump_test "strip-8"
957 run_dump_test "strip-9"
4cd28456
AM
958 if { ![istarget "*-*-hpux*"]
959 && ![istarget "msp*-*-*"] } {
960 run_dump_test "strip-10"
961 }
312aaa3c 962
b8b6abe0
AM
963 if { [istarget "i*86-*"] || [istarget "x86_64-*-*"] } {
964 # Check to make sure we don't strip a symbol named in relocations.
965 set test "objcopy keeps symbols needed by relocs"
312aaa3c 966
b8b6abe0 967 set srcfile $srcdir/$subdir/needed-by-reloc.s
312aaa3c 968
b8b6abe0
AM
969 if {![binutils_assemble $srcfile tmpdir/bintest.o]} then {
970 unresolved $test
971 } else {
972 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-symbol=foo tmpdir/bintest.o ${copyfile}.o"]
312aaa3c 973
b8b6abe0
AM
974 if [regexp "not stripping symbol `foo' because it is named in a relocation" $got] {
975 pass $test
976 } else {
977 fail $test
978 }
979 }
312aaa3c 980 }
b8b6abe0
AM
981
982 run_dump_test "localize-hidden-1"
afeb3d7f
L
983 run_dump_test "testranges"
984 run_dump_test "testranges-ia64"
500ee42e
ILT
985
986 run_dump_test "add-section"
987 run_dump_test "add-empty-section"
18ae9cc1
L
988
989 run_dump_test "exclude-1a"
990 run_dump_test "exclude-1b"
312aaa3c 991}
b8b6abe0 992run_dump_test "localize-hidden-2"
This page took 0.567245 seconds and 4 git commands to generate.