2008-10-01 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/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
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-*-rtems*" "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*" "sh-*-rtems*"
91 setup_xfail "tic4x-*-*" "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 fail "objcopy --reverse-bytes"
135 } else {
136 scan $origdata "%2x%2x%2x%2x" b1 b2 b3 b4
137 scan $revdata "%2x%2x%2x%2x" c4 c3 c2 c1
138
139 if {$b1 == $c1 && $b2 == $c2 && $b3 == $c3 && $b4 == $c4} then {
140 pass "objcopy --reverse-bytes"
141 } else {
142 fail "objcopy --reverse-bytes"
143 }
144 }
145 }
146
147 # Test generating S records.
148
149 # We make the srec filename 8.3 compatible. Note that the header string
150 # matched against depends on the name of the file. Ugh.
151
152 if [is_remote host] {
153 set srecfile copy.sre
154 set header_string S00B0000636F70792E737265C1
155 } else {
156 set srecfile ${copyfile}.srec
157 set header_string S0130000746D706469722F636F70792E7372656397
158 }
159
160 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"]
161
162 if ![string match "" $got] then {
163 fail "objcopy -O srec"
164 } else {
165 if [is_remote host] {
166 remote_upload host ${srecfile} tmpdir/copy.srec
167 set srecfile tmpdir/copy.srec
168 }
169 set file [open ${srecfile} r]
170
171 # The first S record is fixed by the file name we are using.
172 gets $file line
173 send_log "$line\n"
174 verbose $line
175 if ![regexp "$header_string.*" $line] {
176 send_log "bad header\n"
177 fail "objcopy -O srec"
178 } else {
179 while {[gets $file line] != -1 \
180 && [regexp "^S\[123\]\[0-9a-fA-F\]+\[\r\n\]*$" $line]} {
181 send_log "$line\n"
182 verbose $line
183 set line "**EOF**"
184 }
185 send_log "$line\n"
186 verbose $line
187 if ![regexp "^S\[789\]\[0-9a-fA-F\]+\[\r\n\]*$" $line] then {
188 send_log "bad trailer\n"
189 fail "objcopy -O srec"
190 } else {
191 if {[gets $file line] != -1} then {
192 send_log "garbage at end\n"
193 send_log "$line\n"
194 verbose $line
195 fail "objcopy -O srec"
196 } else {
197 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${srecfile}"]
198 if ![regexp "file format srec" $got] then {
199 send_log "objdump failed\n"
200 fail "objcopy -O srec"
201 } else {
202 pass "objcopy -O srec"
203 }
204 }
205 }
206 }
207
208 close $file
209 }
210
211 # Test setting and adjusting the start address. We only test this
212 # while generating S records, because we may not be able to set the
213 # start address for other object file formats, and the S record case
214 # is the only useful one anyhow.
215
216 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $tempfile"]
217 if ![regexp "start address (\[0-9a-fA-FxX\]+)" $got all origstart] then {
218 perror "objdump can not recognize bintest.o"
219 set origstart ""
220 } else {
221 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --set-start 0x7654 $tempfile ${copyfile}.srec"]
222 if ![string match "" $got] then {
223 fail "objcopy --set-start"
224 } else {
225 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
226 if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
227 fail "objcopy --set-start"
228 } else {
229 if {$srecstart != 0x7654} then {
230 send_log "$srecstart != 0x7654\n"
231 fail "objcopy --set-start"
232 } else {
233 pass "objcopy --set-start"
234 }
235 }
236 }
237
238 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-start 0x123 $tempfile ${copyfile}.srec"]
239 if ![string match "" $got] then {
240 fail "objcopy --adjust-start"
241 } else {
242 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
243 if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
244 fail "objcopy --adjust-start"
245 } else {
246 if {$srecstart != $origstart + 0x123} then {
247 send_log "$srecstart != $origstart + 0x123\n"
248 fail "objcopy --adjust-start"
249 } else {
250 pass "objcopy --adjust-start"
251 }
252 }
253 }
254 }
255
256 # Test adjusting the overall VMA, and adjusting the VMA of a
257 # particular section. We again only test this when generating S
258 # records.
259
260 set low ""
261 set lowname ""
262
263 set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"]
264
265 set headers_regexp "\[ 0-9\]+(\[^ \]+)\[ \]*(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+2\[*\]\[*\]\[0-9\]+(.*)"
266
267 set got $headers
268 while {[regexp $headers_regexp $got all name size vma rest]} {
269 set vma 0x$vma
270 set size 0x$size
271 if {$size != 0} {
272 if {$low == "" || $vma < $low} {
273 set low $vma
274 set lowname $name
275 }
276 }
277 set got $rest
278 }
279
280 if {$low == "" || $origstart == ""} then {
281 perror "objdump can not recognize bintest.o"
282 } else {
283 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-vma 0x123 $tempfile ${copyfile}.srec"]
284 if ![string match "" $got] then {
285 fail "objcopy --adjust-vma"
286 } else {
287 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -fh ${copyfile}.srec"]
288 set want "file format srec.*start address\[ \]*(\[0-9a-fA-FxX\]+).*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
289 if ![regexp $want $got all start vma] then {
290 fail "objcopy --adjust-vma"
291 } else {
292 set vma 0x$vma
293 if {$vma != $low + 0x123} then {
294 send_log "$vma != $low + 0x123\n"
295 fail "objcopy --adjust-vma"
296 } else {
297 if {$start != $origstart + 0x123} then {
298 send_log "$start != $origstart + 0x123\n"
299 fail "objcopy --adjust-vma"
300 } else {
301 pass "objcopy --adjust-vma"
302 }
303 }
304 }
305 }
306
307 set arg ""
308 set got $headers
309 while {[regexp $headers_regexp $got all name size vma rest]} {
310 set vma 0x$vma
311 if {$vma == $low} then {
312 set arg "$arg --adjust-section-vma $name+4"
313 }
314 set got $rest
315 }
316
317 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $arg $tempfile ${copyfile}.srec"]
318 if ![string match "" $got] then {
319 fail "objcopy --adjust-section-vma +"
320 } else {
321 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
322 set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
323 if ![regexp $want $got all vma] then {
324 fail "objcopy --adjust-section-vma +"
325 } else {
326 set vma 0x$vma
327 if {$vma != $low + 4} then {
328 send_log "$vma != $low + 4\n"
329 fail "objcopy --adjust-section-vma +"
330 } else {
331 pass "objcopy --adjust-section-vma +"
332 }
333 }
334 }
335
336 regsub -all "\\+4" $arg "=[expr $low + 4]" argeq
337 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $argeq $tempfile ${copyfile}.srec"]
338 if ![string match "" $got] then {
339 fail "objcopy --adjust-section-vma ="
340 } else {
341 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
342 set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
343 if ![regexp $want $got all vma] then {
344 fail "objcopy --adjust-section-vma ="
345 } else {
346 set vma 0x$vma
347 if {$vma != $low + 4} then {
348 send_log "$vma != $low + 4\n"
349 fail "objcopy --adjust-section-vma ="
350 } else {
351 pass "objcopy --adjust-section-vma ="
352 }
353 }
354 }
355 }
356
357 # Test stripping an object.
358
359 proc strip_test { } {
360 global AR
361 global CC
362 global STRIP
363 global STRIPFLAGS
364 global NM
365 global NMFLAGS
366 global srcdir
367 global subdir
368
369 set test "strip"
370
371 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
372 untested $test
373 return
374 }
375
376 if [is_remote host] {
377 set archive libstrip.a
378 set objfile [remote_download host tmpdir/testprog.o]
379 remote_file host delete $archive
380 } else {
381 set archive tmpdir/libstrip.a
382 set objfile tmpdir/testprog.o
383 }
384
385 remote_file build delete tmpdir/libstrip.a
386
387 set exec_output [binutils_run $AR "rc $archive ${objfile}"]
388 if ![string match "" $exec_output] {
389 fail $test
390 return
391 }
392
393 set exec_output [binutils_run $STRIP "-g $archive"]
394 if ![string match "" $exec_output] {
395 fail $test
396 return
397 }
398
399 set exec_output [binutils_run $STRIP "$STRIPFLAGS $archive"]
400 if ![string match "" $exec_output] {
401 fail $test
402 return
403 }
404
405 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
406 untested $test
407 return
408 }
409
410 if [is_remote host] {
411 set objfile [remote_download host tmpdir/testprog.o]
412 } else {
413 set objfile tmpdir/testprog.o
414 }
415
416 set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"]
417 if ![string match "" $exec_output] {
418 fail $test
419 return
420 }
421
422 set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"]
423 if ![string match "*: no symbols*" $exec_output] {
424 fail $test
425 return
426 }
427
428 pass $test
429 }
430
431 strip_test
432
433 # Test stripping an object file with saving a symbol
434
435 proc strip_test_with_saving_a_symbol { } {
436 global CC
437 global STRIP
438 global STRIPFLAGS
439 global NM
440 global NMFLAGS
441 global srcdir
442 global subdir
443
444 set test "strip with saving a symbol"
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 -K main -K _main $objfile"]
458 if ![string match "" $exec_output] {
459 fail $test
460 return
461 }
462
463 set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
464 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
465 && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} {
466 fail $test
467 return
468 }
469
470 pass $test
471 }
472
473 strip_test_with_saving_a_symbol
474
475 # Build a final executable.
476
477 if { [istarget *-*-cygwin] || [istarget *-*-mingw*] } {
478 set test_prog "testprog.exe"
479 } else {
480 set test_prog "testprog"
481 }
482
483 proc copy_setup { } {
484 global srcdir
485 global subdir
486 global gcc_gas_flag
487 global test_prog
488 global host_triplet
489
490 set res [build_wrapper testglue.o]
491 set flags { debug }
492
493 if { [istarget *-*-uclinux*] } {
494 return 1
495 }
496
497 if { $res != "" } {
498 lappend flags "additional_flags=[lindex $res 1]"
499 set add_libs "testglue.o"
500 } else {
501 set add_libs ""
502 }
503
504 if { [istarget *-*-linux*] } {
505 foreach i $gcc_gas_flag {
506 set flags "additional_flags=$i $flags"
507 }
508 }
509 if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/$test_prog executable $flags] != "" } {
510 return 2
511 }
512
513 set result [remote_load target tmpdir/$test_prog]
514 set status [lindex $result 0]
515
516 if { $status != "pass" } {
517 send_log "cannot run executable, status = ${status} on ${host_triplet}\n"
518 if { [istarget $host_triplet] } {
519 return 3
520 }
521 set status "pass"
522 }
523
524 return 0
525 }
526
527 # Test copying an executable.
528
529 proc copy_executable { prog flags test1 test2 } {
530 global test_prog
531 global host_triplet
532
533 if [is_remote host] {
534 set testfile [remote_download host tmpdir/$test_prog]
535 set testcopy copyprog
536 } else {
537 set testfile tmpdir/$test_prog
538 set testcopy tmpdir/copyprog
539 }
540 remote_file host delete $testcopy
541
542 set exec_output [binutils_run $prog "$flags $testfile $testcopy"]
543
544 if ![string match "" $exec_output] {
545 fail $test1
546 if [string match "" $test2] {
547 return
548 }
549 fail $test2
550 return
551 }
552
553 if [is_remote host] {
554 remote_upload host $testcopy tmpdir/copyprog
555 }
556
557 set status [remote_exec build "cmp" "tmpdir/$test_prog tmpdir/copyprog"]
558 set exec_output [lindex $status 1]
559
560 if [string match "" $exec_output] then {
561 pass $test1
562 } else {
563 send_log "$exec_output\n"
564 verbose "$exec_output"
565
566 # This will fail for many reasons. For example, it will most
567 # likely fail if a non-GNU linker is used. Therefore, we do
568 # not insist that it pass. If you are using an assembler and
569 # linker based on the same BFD as objcopy, it is worth
570 # investigating to see why this failure occurs. If we are
571 # cross compiling, we assume that a GNU linker is being used,
572 # and expect it to succeed.
573 if {[isnative]} then {
574 setup_xfail "*-*-*"
575 }
576
577 # This also fails for mips*-*-elf targets. See elf32-mips.c
578 # mips_elf_sym_is_global.
579 setup_xfail "mips*-*-elf"
580
581 setup_xfail "*arm*-*-coff"
582 setup_xfail "xscale-*-coff"
583 setup_xfail "arm*-*-pe"
584 setup_xfail "thumb*-*-coff"
585 setup_xfail "thumb*-*-pe"
586 setup_xfail "x86_64-*-mingw*"
587
588 fail $test1
589 }
590
591 if [string match "" $test2] {
592 return
593 }
594
595 set output [remote_load target tmpdir/copyprog]
596 set status [lindex $output 0]
597 if { ![istarget $host_triplet] } {
598 set status "pass"
599 }
600 if { $status != "pass" } {
601 fail $test2
602 } else {
603 pass $test2
604 }
605 }
606
607 # Test stripping an executable
608
609 proc strip_executable { prog flags test } {
610 global NM
611 global NMFLAGS
612 global host_triplet
613
614 remote_download build tmpdir/copyprog tmpdir/striprog
615 if [is_remote host] {
616 set copyfile [remote_download host tmpdir/striprog]
617 } else {
618 set copyfile tmpdir/striprog
619 }
620
621 set exec_output [binutils_run $prog "$flags ${copyfile}"]
622 if ![string match "" $exec_output] {
623 fail $test
624 return
625 }
626
627 if [is_remote host] {
628 remote_upload host ${copyfile} tmpdir/striprog
629 }
630
631 set result [remote_load target tmpdir/striprog]
632 set status [lindex $result 0]
633 if { ![istarget $host_triplet] } {
634 set status "pass"
635 }
636 if { $status != "pass" } {
637 fail $test
638 return
639 }
640
641 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
642 if ![string match "*: no symbols*" $exec_output] {
643 fail $test
644 return
645 }
646 pass $test
647 }
648
649 # Test stripping an executable with saving a symbol
650
651 proc strip_executable_with_saving_a_symbol { prog flags test } {
652 global NM
653 global NMFLAGS
654 global host_triplet
655
656 remote_download build tmpdir/copyprog tmpdir/striprog
657 if [is_remote host] {
658 set copyfile [remote_download host tmpdir/striprog]
659 } else {
660 set copyfile tmpdir/striprog
661 }
662
663 set exec_output [binutils_run $prog "$flags ${copyfile}"]
664 if ![string match "" $exec_output] {
665 fail $test
666 return
667 }
668
669 if [is_remote host] {
670 remote_upload host ${copyfile} tmpdir/striprog
671 }
672
673 set result [remote_load target tmpdir/striprog]
674 set status [lindex $result 0]
675 if { ![istarget $host_triplet] } {
676 set status "pass"
677 }
678 if { $status != "pass" } {
679 fail $test
680 return
681 }
682
683 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
684 if { [istarget mmix-knuth-mmixware] } {
685 # Whenever there's a symbol in the mmo format, there's the symbol
686 # Main, so remove it manually from the expected output for sake of
687 # this test.
688
689 # Using "" not {} to get the \n and \r translated.
690 regsub "^\[0-9a-fA-F\]+\[ \]+T Main\[\n\r\]+" $exec_output "" exec_output
691 }
692
693 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
694 && ![regexp {^([0-9a-fA-F]+)?[ ]+[TD] _main} $exec_output]} {
695 fail $test
696 return
697 }
698 pass $test
699 }
700
701 # Test keeping only debug symbols of an executable
702
703 proc keep_debug_symbols_and_test_copy { prog1 flags1 test1 prog2 flags2 test2 } {
704 global NM
705 global NMFLAGS
706
707 remote_download build tmpdir/copyprog tmpdir/striprog
708 if [is_remote host] {
709 set copyfile [remote_download host tmpdir/striprog]
710 } else {
711 set copyfile tmpdir/striprog
712 }
713
714 set exec_output [binutils_run $prog1 "$flags1 ${copyfile}"]
715 if ![string match "" $exec_output] {
716 fail $test1
717 return
718 }
719 pass $test1
720
721 set exec_output [binutils_run $prog2 "$flags2 ${copyfile}"]
722 if ![string match "" $exec_output] {
723 fail $test2
724 return
725 }
726 pass $test2
727 }
728
729 set test1 "simple objcopy of executable"
730 set test2 "run objcopy of executable"
731 set test3 "run stripped executable"
732 set test4 "run stripped executable with saving a symbol"
733 set test5 "keep only debug data"
734 set test6 "simple objcopy of debug data"
735
736 switch [copy_setup] {
737 "1" {
738 # do nothing
739 }
740 "2" {
741 untested $test1
742 untested $test2
743 untested $test3
744 untested $test4
745 untested $test5
746 untested $test6
747 }
748 "3" {
749 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" ""
750 unsupported $test2
751 unsupported $test3
752 unsupported $test4
753 unsupported $test5
754 unsupported $test6
755 }
756 "0" {
757 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" "$test2"
758 strip_executable "$STRIP" "$STRIPFLAGS" "$test3"
759 strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test4"
760 keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test5" \
761 "$OBJCOPY" "$OBJCOPYFLAGS" "$test6"
762 }
763 }
764
765 proc objcopy_test_readelf {testname srcfile} {
766 global OBJCOPY
767 global OBJCOPYFLAGS
768 global READELF
769 global srcdir
770 global subdir
771
772 if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
773 unresolved "objcopy ($testname)"
774 return
775 }
776
777 verbose -log "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"
778 set exec_output [remote_exec host "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"]
779 if { [lindex $exec_output 0] != 0
780 || ![string match "" [lindex $exec_output 1]] } then {
781 fail "objcopy ($testname)"
782 return
783 }
784
785 verbose -log "$READELF -a tmpdir/bintest.o > tmpdir/bintest.o.out"
786 set exec_output [remote_exec host "$READELF -a tmpdir/bintest.o" "" "/dev/null" "tmpdir/bintest.o.out"]
787 if { [lindex $exec_output 0] != 0 } then {
788 unresolved "objcopy ($testname)"
789 return
790 }
791 set exec_output [prune_warnings [lindex $exec_output 1]]
792 if ![string match "" $exec_output] then {
793 unresolved "objcopy ($testname)"
794 return
795 }
796
797 verbose -log "$READELF -a tmpdir/copy.o > tmpdir/copy.o.out"
798 set exec_output [remote_exec host "$READELF -a tmpdir/copy.o" "" "/dev/null" "tmpdir/copy.o.out"]
799 if { [lindex $exec_output 0] != 0 } then {
800 unresolved "objcopy ($testname)"
801 return
802 }
803 set exec_output [prune_warnings [lindex $exec_output 1]]
804 if ![string match "" $exec_output] then {
805 unresolved "objcopy ($testname)"
806 return
807 }
808
809 verbose -log "diff tmpdir/bintest.o.out tmpdir/copy.o.out"
810 catch "exec diff tmpdir/bintest.o.out tmpdir/copy.o.out" exec_output
811 set exec_output [prune_warnings $exec_output]
812
813 if [string match "" $exec_output] then {
814 pass "objcopy ($testname)"
815 } else {
816 fail "objcopy ($testname)"
817 }
818 }
819
820 # ia64 specific tests
821 if { ([istarget "ia64-*-elf*"]
822 || [istarget "ia64-*-linux*"]) } {
823 objcopy_test "ia64 link order" link-order.s
824 }
825
826 # ELF specific tests
827 if [is_elf_format] {
828 objcopy_test "ELF unknown section type" unknown.s
829 objcopy_test_readelf "ELF group" group.s
830 objcopy_test_readelf "ELF group" group-2.s
831 run_dump_test "copy-1"
832 }
833
834 run_dump_test "copy-2"
835 run_dump_test "copy-3"
836
837 if [is_elf_format] {
838 run_dump_test "strip-1"
839 run_dump_test "strip-2"
840 run_dump_test "strip-3"
841 run_dump_test "strip-4"
842 run_dump_test "strip-5"
843
844 if { [istarget "i*86-*"] || [istarget "x86_64-*-*"] } {
845 # Check to make sure we don't strip a symbol named in relocations.
846 set test "objcopy keeps symbols needed by relocs"
847
848 set srcfile $srcdir/$subdir/needed-by-reloc.s
849
850 if {![binutils_assemble $srcfile tmpdir/bintest.o]} then {
851 unresolved $test
852 } else {
853 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-symbol=foo tmpdir/bintest.o ${copyfile}.o"]
854
855 if [regexp "not stripping symbol `foo' because it is named in a relocation" $got] {
856 pass $test
857 } else {
858 fail $test
859 }
860 }
861 }
862
863 run_dump_test "localize-hidden-1"
864 }
865 run_dump_test "localize-hidden-2"
This page took 0.066475 seconds and 5 git commands to generate.