* elf32-spu.c (build_stub): Fix malloc under-allocation.
[binutils.git] / binutils / testsuite / binutils-all / objcopy.exp
blob94362b7ccd84e660a55afaf2e30e99d3aac095fc
1 # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2 # 2004, 2006, 2007, 2009, 2010, 2011
3 # Free Software Foundation, Inc.
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
7 # the Free Software Foundation; either version 3 of the License, or
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.
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
17 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
19 # Please email any bugs, comments, and/or additions to this file to:
20 # bug-dejagnu@prep.ai.mit.edu
22 # Written by Ian Lance Taylor <ian@cygnus.com>
24 if ![is_remote host] {
25 if {[which $OBJCOPY] == 0} then {
26 perror "$OBJCOPY does not exist"
27 return
31 send_user "Version [binutil_version $OBJCOPY]"
33 if ![is_remote host] {
34 set tempfile tmpdir/bintest.o
35 set copyfile tmpdir/copy
36 } else {
37 set tempfile [remote_download host tmpdir/bintest.o]
38 set copyfile copy
41 # Test that objcopy does not modify a file when copying it.
43 proc objcopy_test {testname srcfile} {
44 global OBJCOPY
45 global OBJCOPYFLAGS
46 global srcdir
47 global subdir
48 global tempfile
49 global copyfile
51 if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
52 perror "unresolved $testname"
53 unresolved "objcopy ($testname)"
54 return
57 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $tempfile ${copyfile}.o"]
59 if ![string match "" $got] then {
60 fail "objcopy ($testname)"
61 } else {
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
73 set status [remote_exec build cmp "${src1} ${src2}"]
74 set exec_output [lindex $status 1]
75 set exec_output [prune_warnings $exec_output]
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.
82 setup_xfail "h8300-*-coff"
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"
90 setup_xfail "sh-*-coff*"
91 setup_xfail "tic80-*-*" "w65-*"
93 clear_xfail "hppa*64*-*-hpux*" "hppa*-*-linux*" "hppa*-*-lites*"
94 clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-rtems*" "*-*-*elf*"
95 clear_xfail "m68*-*-sysv4*"
97 if [string match "" $exec_output] then {
98 pass "objcopy ($testname)"
99 } else {
100 send_log "$exec_output\n"
101 verbose "$exec_output" 1
103 # On OSF/1, this succeeds with gas and fails with /bin/as.
104 setup_xfail "alpha*-*-osf*"
106 fail "objcopy ($testname)"
111 objcopy_test "simple copy" bintest.s
113 # Test reversing bytes in a section.
115 set reversed ${tempfile}-reversed
116 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j .data --reverse-bytes=4 $tempfile $reversed"]
118 if ![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
126 set origdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $tempfile"]
127 set revdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $reversed"]
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]
133 if {$found_orig == 0 || $found_rev == 0} then {
134 # som doesn't have a .data section
135 setup_xfail "hppa*-*-hpux*"
136 clear_xfail "hppa*64*-*-hpux*"
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
143 if {$b1 == $c1 && $b2 == $c2 && $b3 == $c3 && $b4 == $c4} then {
144 pass "objcopy --reverse-bytes"
145 } else {
146 fail "objcopy --reverse-bytes"
151 # Test interleaved copy of multiple byte width
153 set sequence_file sequence_file
154 set file [open ${sequence_file} w]
155 puts ${file} "12345678"
156 close ${file}
158 if [is_remote host] {
159 remote_upload host ${sequence_file} tmpdir/sequence_file
160 set sequence_file tmpdir/sequence_file
163 set got [binutils_run $OBJCOPY "-I binary -i 4 -b 0 --interleave-width 2 ${sequence_file} ${copyfile}"]
165 if ![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}
175 set file [open ${interleave_output} r]
176 gets $file line
177 send_log "$line\n"
178 verbose $line
180 if ![string match "1256" $line] then {
181 fail "objcopy -i --interleave-width"
183 pass "objcopy -i --interleave-width"
185 close $file
188 # Test generating S records.
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.
193 if [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
201 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"]
203 if ![string match "" $got] then {
204 fail "objcopy -O srec"
205 } else {
206 if [is_remote host] {
207 remote_upload host ${srecfile} tmpdir/copy.srec
208 set srecfile tmpdir/copy.srec
210 set file [open ${srecfile} r]
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**"
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 {
238 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${srecfile}"]
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"
249 close $file
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.
257 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $tempfile"]
258 if ![regexp "start address (\[0-9a-fA-FxX\]+)" $got all origstart] then {
259 perror "objdump can not recognize bintest.o"
260 set origstart ""
261 } else {
262 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --set-start 0x7654 $tempfile ${copyfile}.srec"]
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"
279 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-start 0x123 $tempfile ${copyfile}.srec"]
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"
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.
301 set low ""
302 set lowname ""
304 set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"]
306 set headers_regexp "\[ 0-9\]+(\[^ \]+)\[ \]*(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+2\[*\]\[*\]\[0-9\]+(.*)"
308 set got $headers
309 while {[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
318 set got $rest
321 if {$low == "" || $origstart == ""} then {
322 perror "objdump can not recognize bintest.o"
323 } else {
324 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-vma 0x123 $tempfile ${copyfile}.srec"]
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"
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"
355 set got $rest
358 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $arg $tempfile ${copyfile}.srec"]
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 +"
377 regsub -all "\\+4" $arg "=[expr $low + 4]" argeq
378 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $argeq $tempfile ${copyfile}.srec"]
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 ="
398 # Test stripping an object.
400 proc strip_test { } {
401 global AR
402 global CC
403 global STRIP
404 global STRIPFLAGS
405 global NM
406 global NMFLAGS
407 global srcdir
408 global subdir
409 global READELF
411 set test "strip"
413 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
414 untested $test
415 return
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
431 if [is_remote host] {
432 set archive libstrip.a
433 set objfile [remote_download host tmpdir/testprog.o]
434 remote_file host delete $archive
435 } else {
436 set archive tmpdir/libstrip.a
437 set objfile tmpdir/testprog.o
440 remote_file build delete tmpdir/libstrip.a
442 set exec_output [binutils_run $AR "rc $archive ${objfile}"]
443 if ![string match "" $exec_output] {
444 fail $test
445 unresolved "$test preserving OS/ABI"
446 return
449 set exec_output [binutils_run $STRIP "-g $archive"]
450 if ![string match "" $exec_output] {
451 fail $test
452 unresolved "$test preserving OS/ABI"
453 return
456 set exec_output [binutils_run $STRIP "$STRIPFLAGS $archive"]
457 if ![string match "" $exec_output] {
458 fail $test
459 unresolved "$test preserving OS/ABI"
460 return
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"
479 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
480 untested $test
481 return
484 if [is_remote host] {
485 set objfile [remote_download host tmpdir/testprog.o]
486 } else {
487 set objfile tmpdir/testprog.o
490 set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"]
491 if ![string match "" $exec_output] {
492 fail $test
493 return
496 set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"]
497 if ![string match "*: no symbols*" $exec_output] {
498 fail $test
499 return
502 pass $test
505 strip_test
507 # Test stripping an object file with saving a symbol
509 proc 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
518 set test "strip with saving a symbol"
520 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
521 untested $test
522 return
525 if [is_remote host] {
526 set objfile [remote_download host tmpdir/testprog.o]
527 } else {
528 set objfile tmpdir/testprog.o
531 set exec_output [binutils_run $STRIP "$STRIPFLAGS -K main -K _main $objfile"]
532 if ![string match "" $exec_output] {
533 fail $test
534 return
537 set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
538 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
539 && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} {
540 fail $test
541 return
544 pass $test
547 strip_test_with_saving_a_symbol
549 # Build a final executable.
551 if { [istarget *-*-cygwin] || [istarget *-*-mingw*] } {
552 set test_prog "testprog.exe"
553 } else {
554 set test_prog "testprog"
557 proc copy_setup { } {
558 global srcdir
559 global subdir
560 global gcc_gas_flag
561 global test_prog
562 global host_triplet
564 set res [build_wrapper testglue.o]
565 set flags { debug }
567 if { [istarget *-*-uclinux*] && ![istarget tic6x-*-*] } {
568 return 1
571 if { $res != "" } {
572 lappend flags "additional_flags=[lindex $res 1]"
573 set add_libs "testglue.o"
574 } else {
575 set add_libs ""
578 if { [istarget *-*-linux*]
579 || [istarget *-*-gnu*] } {
580 foreach i $gcc_gas_flag {
581 set flags "additional_flags=$i $flags"
584 if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/$test_prog executable $flags] != "" } {
585 return 2
588 set result [remote_load target tmpdir/$test_prog]
589 set status [lindex $result 0]
591 if { $status != "pass" } {
592 send_log "cannot run executable, status = ${status} on ${host_triplet}\n"
593 if { [istarget $host_triplet] } {
594 return 3
596 set status "pass"
599 return 0
602 # Test copying an executable.
604 proc copy_executable { prog flags test1 test2 } {
605 global test_prog
606 global host_triplet
608 if [is_remote host] {
609 set testfile [remote_download host tmpdir/$test_prog]
610 set testcopy copyprog
611 } else {
612 set testfile tmpdir/$test_prog
613 set testcopy tmpdir/copyprog
615 remote_file host delete $testcopy
617 set exec_output [binutils_run $prog "$flags $testfile $testcopy"]
619 if ![string match "" $exec_output] {
620 fail $test1
621 if [string match "" $test2] {
622 return
624 fail $test2
625 return
628 if [is_remote host] {
629 remote_upload host $testcopy tmpdir/copyprog
632 set status [remote_exec build "cmp" "tmpdir/$test_prog tmpdir/copyprog"]
633 set exec_output [lindex $status 1]
635 if [string match "" $exec_output] then {
636 pass $test1
637 } else {
638 send_log "$exec_output\n"
639 verbose "$exec_output"
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 "*-*-*"
652 # This also fails for mips*-*-elf targets. See elf32-mips.c
653 # mips_elf_sym_is_global.
654 setup_xfail "mips*-*-elf"
656 setup_xfail "arm*-*-coff"
657 setup_xfail "arm*-*-pe"
658 setup_xfail "*-*-mingw*"
659 setup_xfail "*-*-cygwin*"
661 fail $test1
664 if [string match "" $test2] {
665 return
668 set output [remote_load target tmpdir/copyprog]
669 set status [lindex $output 0]
670 if { ![istarget $host_triplet] } {
671 set status "pass"
673 if { $status != "pass" } {
674 fail $test2
675 } else {
676 pass $test2
680 # Test stripping an executable
682 proc strip_executable { prog flags test } {
683 global NM
684 global NMFLAGS
685 global READELF
686 global host_triplet
688 remote_file build delete tmpdir/striprog
689 remote_download build tmpdir/copyprog tmpdir/striprog
690 if [is_remote host] {
691 set copyfile [remote_download host tmpdir/striprog]
692 } else {
693 set copyfile tmpdir/striprog
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
709 set exec_output [binutils_run $prog "$flags ${copyfile}"]
710 if ![string match "" $exec_output] {
711 fail $test
712 return
715 if [is_remote host] {
716 remote_upload host ${copyfile} tmpdir/striprog
719 set result [remote_load target tmpdir/striprog]
720 set status [lindex $result 0]
721 if { ![istarget $host_triplet] } {
722 set status "pass"
724 if { $status != "pass" } {
725 fail $test
726 return
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"
745 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
746 if ![string match "*: no symbols*" $exec_output] {
747 fail $test
748 return
750 pass $test
753 # Test stripping an executable with saving a symbol
755 proc strip_executable_with_saving_a_symbol { prog flags test } {
756 global NM
757 global NMFLAGS
758 global host_triplet
760 remote_file build delete tmpdir/striprog
761 remote_download build tmpdir/copyprog tmpdir/striprog
762 if [is_remote host] {
763 set copyfile [remote_download host tmpdir/striprog]
764 } else {
765 set copyfile tmpdir/striprog
768 set exec_output [binutils_run $prog "$flags ${copyfile}"]
769 if ![string match "" $exec_output] {
770 fail $test
771 return
774 if [is_remote host] {
775 remote_upload host ${copyfile} tmpdir/striprog
778 set result [remote_load target tmpdir/striprog]
779 set status [lindex $result 0]
780 if { ![istarget $host_triplet] } {
781 set status "pass"
783 if { $status != "pass" } {
784 fail $test
785 return
788 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
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.
794 # Using "" not {} to get the \n and \r translated.
795 regsub "^\[0-9a-fA-F\]+\[ \]+T Main\[\n\r\]+" $exec_output "" exec_output
798 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
799 && ![regexp {^([0-9a-fA-F]+)?[ ]+[TD] _main} $exec_output]} {
800 fail $test
801 return
803 pass $test
806 # Test keeping only debug symbols of an executable
808 proc keep_debug_symbols_and_test_copy { prog1 flags1 test1 prog2 flags2 test2 } {
809 global NM
810 global NMFLAGS
812 remote_file build delete tmpdir/striprog
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
820 set exec_output [binutils_run $prog1 "$flags1 ${copyfile}"]
821 if ![string match "" $exec_output] {
822 fail $test1
823 return
825 pass $test1
827 set exec_output [binutils_run $prog2 "$flags2 ${copyfile}"]
828 if ![string match "" $exec_output] {
829 fail $test2
830 return
832 pass $test2
835 set test1 "simple objcopy of executable"
836 set test2 "run objcopy of executable"
837 set test3 "run stripped executable"
838 set test4 "run stripped executable with saving a symbol"
839 set test5 "keep only debug data"
840 set test6 "simple objcopy of debug data"
842 switch [copy_setup] {
843 "1" {
844 # do nothing
846 "2" {
847 untested $test1
848 untested $test2
849 untested $test3
850 untested $test4
851 untested $test5
852 untested $test6
854 "3" {
855 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" ""
856 unsupported $test2
857 unsupported $test3
858 unsupported $test4
859 unsupported $test5
860 unsupported $test6
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"
866 keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test5" \
867 "$OBJCOPY" "$OBJCOPYFLAGS" "$test6"
871 proc objcopy_test_readelf {testname srcfile} {
872 global OBJCOPY
873 global OBJCOPYFLAGS
874 global READELF
875 global srcdir
876 global subdir
878 if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
879 unresolved "objcopy ($testname)"
880 return
883 verbose -log "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"
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 {
887 fail "objcopy ($testname)"
888 return
891 verbose -log "$READELF -a tmpdir/bintest.o > tmpdir/bintest.o.out"
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
897 set exec_output [prune_warnings [lindex $exec_output 1]]
898 if ![string match "" $exec_output] then {
899 unresolved "objcopy ($testname)"
900 return
903 verbose -log "$READELF -a tmpdir/copy.o > tmpdir/copy.o.out"
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
909 set exec_output [prune_warnings [lindex $exec_output 1]]
910 if ![string match "" $exec_output] then {
911 unresolved "objcopy ($testname)"
912 return
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]
919 if [string match "" $exec_output] then {
920 pass "objcopy ($testname)"
921 } else {
922 fail "objcopy ($testname)"
926 # ia64 specific tests
927 if { ([istarget "ia64-*-elf*"]
928 || [istarget "ia64-*-linux*"]) } {
929 objcopy_test "ia64 link order" link-order.s
932 # ELF specific tests
933 if [is_elf_format] {
934 objcopy_test "ELF unknown section type" unknown.s
935 objcopy_test_readelf "ELF group" group.s
936 objcopy_test_readelf "ELF group" group-2.s
937 objcopy_test_readelf "ELF group" group-3.s
938 objcopy_test_readelf "ELF group" group-4.s
939 run_dump_test "group-5"
940 run_dump_test "group-6"
941 run_dump_test "copy-1"
942 run_dump_test "note-1"
945 run_dump_test "copy-2"
946 run_dump_test "copy-3"
947 run_dump_test "copy-4"
949 if [is_elf_format] {
950 run_dump_test "strip-1"
951 run_dump_test "strip-2"
952 run_dump_test "strip-3"
953 run_dump_test "strip-4"
954 run_dump_test "strip-5"
955 run_dump_test "strip-6"
956 run_dump_test "strip-7"
957 run_dump_test "strip-8"
958 run_dump_test "strip-9"
959 if { ![istarget "*-*-hpux*"]
960 && ![istarget "msp*-*-*"] } {
961 run_dump_test "strip-10"
964 if { [istarget "i*86-*"] || [istarget "x86_64-*-*"] } {
965 # Check to make sure we don't strip a symbol named in relocations.
966 set test "objcopy keeps symbols needed by relocs"
968 set srcfile $srcdir/$subdir/needed-by-reloc.s
970 if {![binutils_assemble $srcfile tmpdir/bintest.o]} then {
971 unresolved $test
972 } else {
973 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-symbol=foo tmpdir/bintest.o ${copyfile}.o"]
975 if [regexp "not stripping symbol `foo' because it is named in a relocation" $got] {
976 pass $test
977 } else {
978 fail $test
983 # The symbol table for MIPS targets is not sorted by ascending value,
984 # so the regexps in localize-hidden-1.d fail to match.
985 setup_xfail "mips-*-*"
986 run_dump_test "localize-hidden-1"
987 run_dump_test "testranges"
988 run_dump_test "testranges-ia64"
990 run_dump_test "add-section"
991 run_dump_test "add-empty-section"
993 run_dump_test "exclude-1a"
994 run_dump_test "exclude-1b"
996 run_dump_test "localize-hidden-2"