OSDN Git Service

848fb50b05668c7f9c844ad5615529f2968a18ab
[pf3gnuchains/pf3gnuchains4x.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     objcopy_test_readelf "ELF group" group-3.s
832     run_dump_test "copy-1"
833 }
834
835 run_dump_test "copy-2"
836 run_dump_test "copy-3"
837
838 if [is_elf_format] {
839     run_dump_test "strip-1"
840     run_dump_test "strip-2"
841     run_dump_test "strip-3"
842     run_dump_test "strip-4"
843     run_dump_test "strip-5"
844     run_dump_test "strip-6"
845     run_dump_test "strip-7"
846
847     if { [istarget "i*86-*"] || [istarget "x86_64-*-*"] } {
848         # Check to make sure we don't strip a symbol named in relocations.
849         set test "objcopy keeps symbols needed by relocs"
850
851         set srcfile $srcdir/$subdir/needed-by-reloc.s
852
853         if {![binutils_assemble $srcfile tmpdir/bintest.o]} then {
854             unresolved $test
855         } else {
856             set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-symbol=foo tmpdir/bintest.o ${copyfile}.o"]
857
858             if [regexp "not stripping symbol `foo' because it is named in a relocation" $got] {
859                 pass $test
860             } else {
861                 fail $test
862             }
863         }
864     }
865
866     run_dump_test "localize-hidden-1"
867 }
868 run_dump_test "localize-hidden-2"