]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - binutils/testsuite/binutils-all/objcopy.exp
* binutils-all/objcopy.exp objcopy_text): Remove xfails for sh-rtems
[thirdparty/binutils-gdb.git] / binutils / testsuite / binutils-all / objcopy.exp
1 # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2 # 2004, 2006, 2007, 2009, 2010, 2011
3 # Free Software Foundation, Inc.
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
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.
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
17 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
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
24 if ![is_remote host] {
25 if {[which $OBJCOPY] == 0} then {
26 perror "$OBJCOPY does not exist"
27 return
28 }
29 }
30
31 send_user "Version [binutil_version $OBJCOPY]"
32
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
39 }
40
41 # Test that objcopy does not modify a file when copying it.
42
43 proc objcopy_test {testname srcfile} {
44 global OBJCOPY
45 global OBJCOPYFLAGS
46 global srcdir
47 global subdir
48 global tempfile
49 global copyfile
50
51 if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
52 perror "unresolved $testname"
53 unresolved "objcopy ($testname)"
54 return
55 }
56
57 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $tempfile ${copyfile}.o"]
58
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
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
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-*"
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
102
103 # On OSF/1, this succeeds with gas and fails with /bin/as.
104 setup_xfail "alpha*-*-osf*"
105
106 fail "objcopy ($testname)"
107 }
108 }
109 }
110
111 objcopy_test "simple copy" bintest.s
112
113 # Test reversing bytes in a section.
114
115 set reversed ${tempfile}-reversed
116 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j .data --reverse-bytes=4 $tempfile $reversed"]
117
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
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 {
134 # som doesn't have a .data section
135 setup_xfail "hppa*-*-hpux*"
136 clear_xfail "hppa*64*-*-hpux*"
137
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
151 # Test interleaved copy of multiple byte width
152
153 set sequence_file sequence_file
154 set file [open ${sequence_file} w]
155 puts ${file} "12345678"
156 close ${file}
157
158 if [is_remote host] {
159 remote_upload host ${sequence_file} tmpdir/sequence_file
160 set sequence_file tmpdir/sequence_file
161 }
162
163 set got [binutils_run $OBJCOPY "-I binary -i 4 -b 0 --interleave-width 2 ${sequence_file} ${copyfile}"]
164
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}
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
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
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
199 }
200
201 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"]
202
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
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 {
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"
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
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"
275 }
276 }
277 }
278
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"
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
301 set low ""
302 set lowname ""
303
304 set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"]
305
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\]+(.*)"
307
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
316 }
317 }
318 set got $rest
319 }
320
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"
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
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 +"
373 }
374 }
375 }
376
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 ="
393 }
394 }
395 }
396 }
397
398 # Test stripping an object.
399
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
410 set test "strip"
411
412 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
413 untested $test
414 return
415 }
416
417 if [is_remote host] {
418 set archive libstrip.a
419 set objfile [remote_download host tmpdir/testprog.o]
420 remote_file host delete $archive
421 } else {
422 set archive tmpdir/libstrip.a
423 set objfile tmpdir/testprog.o
424 }
425
426 remote_file build delete tmpdir/libstrip.a
427
428 set exec_output [binutils_run $AR "rc $archive ${objfile}"]
429 if ![string match "" $exec_output] {
430 fail $test
431 return
432 }
433
434 set exec_output [binutils_run $STRIP "-g $archive"]
435 if ![string match "" $exec_output] {
436 fail $test
437 return
438 }
439
440 set exec_output [binutils_run $STRIP "$STRIPFLAGS $archive"]
441 if ![string match "" $exec_output] {
442 fail $test
443 return
444 }
445
446 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
447 untested $test
448 return
449 }
450
451 if [is_remote host] {
452 set objfile [remote_download host tmpdir/testprog.o]
453 } else {
454 set objfile tmpdir/testprog.o
455 }
456
457 set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"]
458 if ![string match "" $exec_output] {
459 fail $test
460 return
461 }
462
463 set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"]
464 if ![string match "*: no symbols*" $exec_output] {
465 fail $test
466 return
467 }
468
469 pass $test
470 }
471
472 strip_test
473
474 # Test stripping an object file with saving a symbol
475
476 proc strip_test_with_saving_a_symbol { } {
477 global CC
478 global STRIP
479 global STRIPFLAGS
480 global NM
481 global NMFLAGS
482 global srcdir
483 global subdir
484
485 set test "strip with saving a symbol"
486
487 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
488 untested $test
489 return
490 }
491
492 if [is_remote host] {
493 set objfile [remote_download host tmpdir/testprog.o]
494 } else {
495 set objfile tmpdir/testprog.o
496 }
497
498 set exec_output [binutils_run $STRIP "$STRIPFLAGS -K main -K _main $objfile"]
499 if ![string match "" $exec_output] {
500 fail $test
501 return
502 }
503
504 set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
505 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
506 && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} {
507 fail $test
508 return
509 }
510
511 pass $test
512 }
513
514 strip_test_with_saving_a_symbol
515
516 # Build a final executable.
517
518 if { [istarget *-*-cygwin] || [istarget *-*-mingw*] } {
519 set test_prog "testprog.exe"
520 } else {
521 set test_prog "testprog"
522 }
523
524 proc copy_setup { } {
525 global srcdir
526 global subdir
527 global gcc_gas_flag
528 global test_prog
529 global host_triplet
530
531 set res [build_wrapper testglue.o]
532 set flags { debug }
533
534 if { [istarget *-*-uclinux*] } {
535 return 1
536 }
537
538 if { $res != "" } {
539 lappend flags "additional_flags=[lindex $res 1]"
540 set add_libs "testglue.o"
541 } else {
542 set add_libs ""
543 }
544
545 if { [istarget *-*-linux*]
546 || [istarget *-*-gnu*] } {
547 foreach i $gcc_gas_flag {
548 set flags "additional_flags=$i $flags"
549 }
550 }
551 if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/$test_prog executable $flags] != "" } {
552 return 2
553 }
554
555 set result [remote_load target tmpdir/$test_prog]
556 set status [lindex $result 0]
557
558 if { $status != "pass" } {
559 send_log "cannot run executable, status = ${status} on ${host_triplet}\n"
560 if { [istarget $host_triplet] } {
561 return 3
562 }
563 set status "pass"
564 }
565
566 return 0
567 }
568
569 # Test copying an executable.
570
571 proc copy_executable { prog flags test1 test2 } {
572 global test_prog
573 global host_triplet
574
575 if [is_remote host] {
576 set testfile [remote_download host tmpdir/$test_prog]
577 set testcopy copyprog
578 } else {
579 set testfile tmpdir/$test_prog
580 set testcopy tmpdir/copyprog
581 }
582 remote_file host delete $testcopy
583
584 set exec_output [binutils_run $prog "$flags $testfile $testcopy"]
585
586 if ![string match "" $exec_output] {
587 fail $test1
588 if [string match "" $test2] {
589 return
590 }
591 fail $test2
592 return
593 }
594
595 if [is_remote host] {
596 remote_upload host $testcopy tmpdir/copyprog
597 }
598
599 set status [remote_exec build "cmp" "tmpdir/$test_prog tmpdir/copyprog"]
600 set exec_output [lindex $status 1]
601
602 if [string match "" $exec_output] then {
603 pass $test1
604 } else {
605 send_log "$exec_output\n"
606 verbose "$exec_output"
607
608 # This will fail for many reasons. For example, it will most
609 # likely fail if a non-GNU linker is used. Therefore, we do
610 # not insist that it pass. If you are using an assembler and
611 # linker based on the same BFD as objcopy, it is worth
612 # investigating to see why this failure occurs. If we are
613 # cross compiling, we assume that a GNU linker is being used,
614 # and expect it to succeed.
615 if {[isnative]} then {
616 setup_xfail "*-*-*"
617 }
618
619 # This also fails for mips*-*-elf targets. See elf32-mips.c
620 # mips_elf_sym_is_global.
621 setup_xfail "mips*-*-elf"
622
623 setup_xfail "arm*-*-coff"
624 setup_xfail "arm*-*-pe"
625 setup_xfail "*-*-mingw*"
626 setup_xfail "*-*-cygwin*"
627
628 fail $test1
629 }
630
631 if [string match "" $test2] {
632 return
633 }
634
635 set output [remote_load target tmpdir/copyprog]
636 set status [lindex $output 0]
637 if { ![istarget $host_triplet] } {
638 set status "pass"
639 }
640 if { $status != "pass" } {
641 fail $test2
642 } else {
643 pass $test2
644 }
645 }
646
647 # Test stripping an executable
648
649 proc strip_executable { prog flags test } {
650 global NM
651 global NMFLAGS
652 global host_triplet
653
654 remote_file build delete tmpdir/striprog
655 remote_download build tmpdir/copyprog tmpdir/striprog
656 if [is_remote host] {
657 set copyfile [remote_download host tmpdir/striprog]
658 } else {
659 set copyfile tmpdir/striprog
660 }
661
662 set exec_output [binutils_run $prog "$flags ${copyfile}"]
663 if ![string match "" $exec_output] {
664 fail $test
665 return
666 }
667
668 if [is_remote host] {
669 remote_upload host ${copyfile} tmpdir/striprog
670 }
671
672 set result [remote_load target tmpdir/striprog]
673 set status [lindex $result 0]
674 if { ![istarget $host_triplet] } {
675 set status "pass"
676 }
677 if { $status != "pass" } {
678 fail $test
679 return
680 }
681
682 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
683 if ![string match "*: no symbols*" $exec_output] {
684 fail $test
685 return
686 }
687 pass $test
688 }
689
690 # Test stripping an executable with saving a symbol
691
692 proc strip_executable_with_saving_a_symbol { prog flags test } {
693 global NM
694 global NMFLAGS
695 global host_triplet
696
697 remote_file build delete tmpdir/striprog
698 remote_download build tmpdir/copyprog tmpdir/striprog
699 if [is_remote host] {
700 set copyfile [remote_download host tmpdir/striprog]
701 } else {
702 set copyfile tmpdir/striprog
703 }
704
705 set exec_output [binutils_run $prog "$flags ${copyfile}"]
706 if ![string match "" $exec_output] {
707 fail $test
708 return
709 }
710
711 if [is_remote host] {
712 remote_upload host ${copyfile} tmpdir/striprog
713 }
714
715 set result [remote_load target tmpdir/striprog]
716 set status [lindex $result 0]
717 if { ![istarget $host_triplet] } {
718 set status "pass"
719 }
720 if { $status != "pass" } {
721 fail $test
722 return
723 }
724
725 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
726 if { [istarget mmix-knuth-mmixware] } {
727 # Whenever there's a symbol in the mmo format, there's the symbol
728 # Main, so remove it manually from the expected output for sake of
729 # this test.
730
731 # Using "" not {} to get the \n and \r translated.
732 regsub "^\[0-9a-fA-F\]+\[ \]+T Main\[\n\r\]+" $exec_output "" exec_output
733 }
734
735 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
736 && ![regexp {^([0-9a-fA-F]+)?[ ]+[TD] _main} $exec_output]} {
737 fail $test
738 return
739 }
740 pass $test
741 }
742
743 # Test keeping only debug symbols of an executable
744
745 proc keep_debug_symbols_and_test_copy { prog1 flags1 test1 prog2 flags2 test2 } {
746 global NM
747 global NMFLAGS
748
749 remote_file build delete tmpdir/striprog
750 remote_download build tmpdir/copyprog tmpdir/striprog
751 if [is_remote host] {
752 set copyfile [remote_download host tmpdir/striprog]
753 } else {
754 set copyfile tmpdir/striprog
755 }
756
757 set exec_output [binutils_run $prog1 "$flags1 ${copyfile}"]
758 if ![string match "" $exec_output] {
759 fail $test1
760 return
761 }
762 pass $test1
763
764 set exec_output [binutils_run $prog2 "$flags2 ${copyfile}"]
765 if ![string match "" $exec_output] {
766 fail $test2
767 return
768 }
769 pass $test2
770 }
771
772 set test1 "simple objcopy of executable"
773 set test2 "run objcopy of executable"
774 set test3 "run stripped executable"
775 set test4 "run stripped executable with saving a symbol"
776 set test5 "keep only debug data"
777 set test6 "simple objcopy of debug data"
778
779 switch [copy_setup] {
780 "1" {
781 # do nothing
782 }
783 "2" {
784 untested $test1
785 untested $test2
786 untested $test3
787 untested $test4
788 untested $test5
789 untested $test6
790 }
791 "3" {
792 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" ""
793 unsupported $test2
794 unsupported $test3
795 unsupported $test4
796 unsupported $test5
797 unsupported $test6
798 }
799 "0" {
800 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" "$test2"
801 strip_executable "$STRIP" "$STRIPFLAGS" "$test3"
802 strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test4"
803 keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test5" \
804 "$OBJCOPY" "$OBJCOPYFLAGS" "$test6"
805 }
806 }
807
808 proc objcopy_test_readelf {testname srcfile} {
809 global OBJCOPY
810 global OBJCOPYFLAGS
811 global READELF
812 global srcdir
813 global subdir
814
815 if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
816 unresolved "objcopy ($testname)"
817 return
818 }
819
820 verbose -log "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"
821 set exec_output [remote_exec host "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"]
822 if { [lindex $exec_output 0] != 0
823 || ![string match "" [lindex $exec_output 1]] } then {
824 fail "objcopy ($testname)"
825 return
826 }
827
828 verbose -log "$READELF -a tmpdir/bintest.o > tmpdir/bintest.o.out"
829 set exec_output [remote_exec host "$READELF -a tmpdir/bintest.o" "" "/dev/null" "tmpdir/bintest.o.out"]
830 if { [lindex $exec_output 0] != 0 } then {
831 unresolved "objcopy ($testname)"
832 return
833 }
834 set exec_output [prune_warnings [lindex $exec_output 1]]
835 if ![string match "" $exec_output] then {
836 unresolved "objcopy ($testname)"
837 return
838 }
839
840 verbose -log "$READELF -a tmpdir/copy.o > tmpdir/copy.o.out"
841 set exec_output [remote_exec host "$READELF -a tmpdir/copy.o" "" "/dev/null" "tmpdir/copy.o.out"]
842 if { [lindex $exec_output 0] != 0 } then {
843 unresolved "objcopy ($testname)"
844 return
845 }
846 set exec_output [prune_warnings [lindex $exec_output 1]]
847 if ![string match "" $exec_output] then {
848 unresolved "objcopy ($testname)"
849 return
850 }
851
852 verbose -log "diff tmpdir/bintest.o.out tmpdir/copy.o.out"
853 catch "exec diff tmpdir/bintest.o.out tmpdir/copy.o.out" exec_output
854 set exec_output [prune_warnings $exec_output]
855
856 if [string match "" $exec_output] then {
857 pass "objcopy ($testname)"
858 } else {
859 fail "objcopy ($testname)"
860 }
861 }
862
863 # ia64 specific tests
864 if { ([istarget "ia64-*-elf*"]
865 || [istarget "ia64-*-linux*"]) } {
866 objcopy_test "ia64 link order" link-order.s
867 }
868
869 # ELF specific tests
870 if [is_elf_format] {
871 objcopy_test "ELF unknown section type" unknown.s
872 objcopy_test_readelf "ELF group" group.s
873 objcopy_test_readelf "ELF group" group-2.s
874 objcopy_test_readelf "ELF group" group-3.s
875 objcopy_test_readelf "ELF group" group-4.s
876 run_dump_test "group-5"
877 run_dump_test "copy-1"
878 run_dump_test "note-1"
879 }
880
881 run_dump_test "copy-2"
882 run_dump_test "copy-3"
883 run_dump_test "copy-4"
884
885 if [is_elf_format] {
886 run_dump_test "strip-1"
887 run_dump_test "strip-2"
888 run_dump_test "strip-3"
889 run_dump_test "strip-4"
890 run_dump_test "strip-5"
891 run_dump_test "strip-6"
892 run_dump_test "strip-7"
893 run_dump_test "strip-8"
894 run_dump_test "strip-9"
895 if { ![istarget "*-*-hpux*"]
896 && ![istarget "msp*-*-*"] } {
897 run_dump_test "strip-10"
898 }
899
900 if { [istarget "i*86-*"] || [istarget "x86_64-*-*"] } {
901 # Check to make sure we don't strip a symbol named in relocations.
902 set test "objcopy keeps symbols needed by relocs"
903
904 set srcfile $srcdir/$subdir/needed-by-reloc.s
905
906 if {![binutils_assemble $srcfile tmpdir/bintest.o]} then {
907 unresolved $test
908 } else {
909 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-symbol=foo tmpdir/bintest.o ${copyfile}.o"]
910
911 if [regexp "not stripping symbol `foo' because it is named in a relocation" $got] {
912 pass $test
913 } else {
914 fail $test
915 }
916 }
917 }
918
919 run_dump_test "localize-hidden-1"
920 run_dump_test "testranges"
921 run_dump_test "testranges-ia64"
922
923 run_dump_test "add-section"
924 run_dump_test "add-empty-section"
925
926 run_dump_test "exclude-1a"
927 run_dump_test "exclude-1b"
928 }
929 run_dump_test "localize-hidden-2"