Remove a29k support.
[platform/upstream/binutils.git] / binutils / testsuite / binutils-all / objcopy.exp
1 #   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2 #   2004
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 2 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 {![binutils_assemble $srcdir/$subdir/bintest.s tmpdir/bintest.o]} then {
34     perror "unresolved 1"
35     unresolved "objcopy (simple copy)"
36     return
37 }
38
39 if ![is_remote host] {
40     set tempfile tmpdir/bintest.o
41     set copyfile tmpdir/copy
42 } else {
43     set tempfile [remote_download host tmpdir/bintest.o]
44     set copyfile copy
45 }
46
47 # Test that objcopy does not modify a file when copying it.
48
49 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $tempfile ${copyfile}.o"]
50
51 if ![string match "" $got] then {
52     fail "objcopy (simple copy)"
53 } else {
54     send_log "cmp $tempfile ${copyfile}.o\n"
55     verbose "cmp $tempfile ${copyfile}.o"
56     if [is_remote host] {
57         set src1 tmpdir/bintest.o
58         set src2 tmpdir/copy.o
59         remote_upload host $tempfile $src1
60         remote_upload host ${copyfile}.o $src2
61     } else {
62         set src1 ${tempfile}
63         set src2 ${copyfile}.o
64     }
65     set status [remote_exec build cmp "${src1} ${src2}"]
66     set exec_output [lindex $status 1]
67     set exec_output [prune_warnings $exec_output]
68
69     # On some systems the result of objcopy will not be identical.
70     # Usually this is just because gas isn't using bfd to write the files
71     # in the first place, and may order things a little differently.
72     # Those systems should use setup_xfail here.
73
74     setup_xfail "h8300-*-rtems*" "h8300-*-coff"
75     setup_xfail "h8500-*-rtems*" "h8500-*-coff"
76     setup_xfail "hppa*-*-*"
77     setup_xfail "i960-*"
78     setup_xfail "m68*-*-*coff" "m68*-*-hpux*" "m68*-*-lynxos*"
79     setup_xfail "m68*-*-sysv*" "m68*-apple-aux*"
80     setup_xfail "m8*-*"
81     setup_xfail "or32-*-rtems*" "or32-*-coff"
82     setup_xfail "sh-*-coff*" "sh-*-rtems*" 
83     setup_xfail "tic4x-*-*" "tic80-*-*" "w65-*" "z8*-*"
84
85     clear_xfail "hppa*64*-*-hpux*" "hppa*-*-linux*" "hppa*-*-lites*"
86     clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-rtems*" "*-*-*elf*" "m68*-*-sysv4*"
87
88     if [string match "" $exec_output] then {
89         pass "objcopy (simple copy)"
90     } else {
91         send_log "$exec_output\n"
92         verbose "$exec_output" 1
93
94         # On OSF/1, this succeeds with gas and fails with /bin/as.
95         setup_xfail "alpha*-*-osf*"
96
97         # This fails for COFF i960-vxworks targets.
98         setup_xfail "i960-*-vxworks*"
99
100         fail "objcopy (simple copy)"
101     }
102 }
103
104 # Test generating S records.
105
106 # We make the srec filename 8.3 compatible. Note that the header string
107 # matched against depends on the name of the file. Ugh.
108
109 if [is_remote host] {
110     set srecfile copy.sre
111     set header_string S00B0000636F70792E737265C1
112 } else {
113     set srecfile ${copyfile}.srec
114     set header_string S0130000746D706469722F636F70792E7372656397
115 }
116
117 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"]
118
119 if ![string match "" $got] then {
120     fail "objcopy -O srec"
121 } else {
122     if [is_remote host] {
123         remote_upload host ${srecfile} tmpdir/copy.srec
124         set srecfile tmpdir/copy.srec
125     }
126     set file [open ${srecfile} r]
127
128     # The first S record is fixed by the file name we are using.
129     gets $file line
130     send_log "$line\n"
131     verbose $line
132     if ![regexp "$header_string.*" $line] {
133         send_log "bad header\n"
134         fail "objcopy -O srec"
135     } else {
136         while {[gets $file line] != -1 \
137                && [regexp "^S\[123\]\[0-9a-fA-F\]+\[\r\n\]*$" $line]} {
138             send_log "$line\n"
139             verbose $line
140             set line "**EOF**"
141         }
142         send_log "$line\n"
143         verbose $line
144         if ![regexp "^S\[789\]\[0-9a-fA-F\]+\[\r\n\]*$" $line] then {
145             send_log "bad trailer\n"
146             fail "objcopy -O srec"
147         } else {
148             if {[gets $file line] != -1} then {
149                 send_log "garbage at end\n"
150                 send_log "$line\n"
151                 verbose $line
152                 fail "objcopy -O srec"
153             } else {
154                 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
155                 if ![regexp "file format srec" $got] then {
156                     send_log "objdump failed\n"
157                     fail "objcopy -O srec"
158                 } else {
159                     pass "objcopy -O srec"
160                 }
161             }
162         }
163     }
164
165     close $file
166 }
167
168 # Test setting and adjusting the start address.  We only test this
169 # while generating S records, because we may not be able to set the
170 # start address for other object file formats, and the S record case
171 # is the only useful one anyhow.
172
173 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $tempfile"]
174 if ![regexp "start address (\[0-9a-fA-FxX\]+)" $got all origstart] then {
175     perror "objdump can not recognize bintest.o"
176     set origstart ""
177 } else {
178     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --set-start 0x7654 $tempfile ${copyfile}.srec"]
179     if ![string match "" $got] then {
180         fail "objcopy --set-start"
181     } else {
182         set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
183         if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
184             fail "objcopy --set-start"
185         } else {
186             if {$srecstart != 0x7654} then {
187                 send_log "$srecstart != 0x7654\n"
188                 fail "objcopy --set-start"
189             } else {
190                 pass "objcopy --set-start"
191             }
192         }
193     }
194
195     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-start 0x123 $tempfile ${copyfile}.srec"]
196     if ![string match "" $got] then {
197         fail "objcopy --adjust-start"
198     } else {
199         set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
200         if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
201             fail "objcopy --adjust-start"
202         } else {
203             if {$srecstart != $origstart + 0x123} then {
204                 send_log "$srecstart != $origstart + 0x123\n"
205                 fail "objcopy --adjust-start"
206             } else {
207                 pass "objcopy --adjust-start"
208             }
209         }
210     }
211 }
212
213 # Test adjusting the overall VMA, and adjusting the VMA of a
214 # particular section.  We again only test this when generating S
215 # records.
216
217 set low ""
218 set lowname ""
219
220 set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"]
221
222 set headers_regexp "\[  0-9\]+(\[^      \]+)\[  \]*(\[0-9a-fA-F\]+)\[   \]+\[0-9a-fA-F\]+\[     \]+(\[0-9a-fA-F\]+)\[   \]+\[0-9a-fA-F\]+\[     \]+2\[*\]\[*\]\[0-9\]+(.*)"
223
224 set got $headers
225 while {[regexp $headers_regexp $got all name size vma rest]} {
226     set vma 0x$vma
227     set size 0x$size
228     if {$size != 0} {
229         if {$low == "" || $vma < $low} {
230             set low $vma
231             set lowname $name
232         }
233     }
234     set got $rest
235 }
236
237 if {$low == "" || $origstart == ""} then {
238     perror "objdump can not recognize bintest.o"
239 } else {
240     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-vma 0x123 $tempfile ${copyfile}.srec"]
241     if ![string match "" $got] then {
242         fail "objcopy --adjust-vma"
243     } else {
244         set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -fh ${copyfile}.srec"]
245         set want "file format srec.*start address\[     \]*(\[0-9a-fA-FxX\]+).*sec1\[   \]+\[0-9a-fA-F\]+\[     \]+(\[0-9a-fA-F\]+)"
246         if ![regexp $want $got all start vma] then {
247             fail "objcopy --adjust-vma"
248         } else {
249             set vma 0x$vma
250             if {$vma != $low + 0x123} then {
251                 send_log "$vma != $low + 0x123\n"
252                 fail "objcopy --adjust-vma"
253             } else {
254                 if {$start != $origstart + 0x123} then {
255                     send_log "$start != $origstart + 0x123\n"
256                     fail "objcopy --adjust-vma"
257                 } else {
258                     pass "objcopy --adjust-vma"
259                 }
260             }
261         }
262     }
263
264     set arg ""
265     set got $headers
266     while {[regexp $headers_regexp $got all name size vma rest]} {
267         set vma 0x$vma
268         if {$vma == $low} then {
269             set arg "$arg --adjust-section-vma $name+4"
270         }
271         set got $rest
272     }
273
274     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $arg $tempfile ${copyfile}.srec"]
275     if ![string match "" $got] then {
276         fail "objcopy --adjust-section-vma +"
277     } else {
278         set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
279         set want "file format srec.*sec1\[      \]+\[0-9a-fA-F\]+\[     \]+(\[0-9a-fA-F\]+)"
280         if ![regexp $want $got all vma] then {
281             fail "objcopy --adjust-section-vma +"
282         } else {
283             set vma 0x$vma
284             if {$vma != $low + 4} then {
285                 send_log "$vma != $low + 4\n"
286                 fail "objcopy --adjust-section-vma +"
287             } else {
288                 pass "objcopy --adjust-section-vma +"
289             }
290         }
291     }
292
293     regsub -all "\\+4" $arg "=[expr $low + 4]" argeq
294     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $argeq $tempfile ${copyfile}.srec"]
295     if ![string match "" $got] then {
296         fail "objcopy --adjust-section-vma ="
297     } else {
298         set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
299         set want "file format srec.*sec1\[      \]+\[0-9a-fA-F\]+\[     \]+(\[0-9a-fA-F\]+)"
300         if ![regexp $want $got all vma] then {
301             fail "objcopy --adjust-section-vma ="
302         } else {
303             set vma 0x$vma
304             if {$vma != $low + 4} then {
305                 send_log "$vma != $low + 4\n"
306                 fail "objcopy --adjust-section-vma ="
307             } else {
308                 pass "objcopy --adjust-section-vma ="
309             }
310         }
311     }
312 }
313
314 # Test stripping an object.
315
316 proc strip_test { } {
317     global AR
318     global CC
319     global STRIP
320     global STRIPFLAGS
321     global NM
322     global NMFLAGS
323     global srcdir
324     global subdir
325
326     set test "strip"
327
328     if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
329         untested $test
330         return
331     }
332
333     if [is_remote host] {
334         set archive libstrip.a
335         set objfile [remote_download host tmpdir/testprog.o]
336         remote_file host delete $archive
337     } else {
338         set archive tmpdir/libstrip.a
339         set objfile tmpdir/testprog.o
340     }
341
342     remote_file build delete tmpdir/libstrip.a
343
344     set exec_output [binutils_run $AR "rc $archive ${objfile}"]
345     if ![string match "" $exec_output] {
346         fail $test
347         return
348     }
349
350     set exec_output [binutils_run $STRIP "$STRIPFLAGS $archive"]
351     if ![string match "" $exec_output] {
352         fail $test
353         return
354     }
355
356     if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
357         untested $test
358         return
359     }
360
361     if [is_remote host] {
362         set objfile [remote_download host tmpdir/testprog.o]
363     } else {
364         set objfile tmpdir/testprog.o
365     }
366
367     set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"]
368     if ![string match "" $exec_output] {
369         fail $test
370         return
371     }
372
373     set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"]
374     if ![string match "*: no symbols*" $exec_output] {
375         fail $test
376         return
377     }
378
379     pass $test
380 }
381
382 strip_test
383
384 # Test stripping an object file with saving a symbol
385
386 proc strip_test_with_saving_a_symbol { } {
387     global CC
388     global STRIP
389     global STRIPFLAGS
390     global NM
391     global NMFLAGS
392     global srcdir
393     global subdir
394
395     set test "strip with saving a symbol"
396
397     if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
398         untested $test
399         return
400     }
401
402     if [is_remote host] {
403         set objfile [remote_download host tmpdir/testprog.o]
404     } else {
405         set objfile tmpdir/testprog.o
406     }
407
408     set exec_output [binutils_run $STRIP "$STRIPFLAGS -K main -K _main $objfile"]
409     if ![string match "" $exec_output] {
410         fail $test
411         return
412     }
413
414     set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
415     if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
416          && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} {
417         fail $test
418         return
419     }
420
421     pass $test
422 }
423
424 strip_test_with_saving_a_symbol
425
426 # Build a final executable.
427
428 if { [istarget *-*-cygwin] || [istarget *-*-mingw32] } {
429     set test_prog "testprog.exe"
430 } else {
431     set test_prog "testprog"
432 }
433
434 proc copy_setup { } {
435     global srcdir
436     global subdir
437     global gcc_gas_flag
438     global test_prog
439     
440     set res [build_wrapper testglue.o]
441     set flags { debug }
442     
443     if { $res != "" } {
444         lappend flags "additional_flags=[lindex $res 1]"
445         set add_libs "testglue.o"
446     } else {
447         set add_libs ""
448     }
449
450     if { [istarget *-*-linux*] } {
451         foreach i $gcc_gas_flag {
452             set flags "additional_flags=$i $flags"
453         }
454     }
455     if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/$test_prog executable $flags]  != "" } {
456         return 2
457     }
458
459     set result [remote_load target tmpdir/$test_prog]
460     set status [lindex $result 0]
461
462     if { $status != "pass"  } {
463         perror "unresolved setup, status = $status"
464         return 3
465     }
466
467     return 0
468 }
469
470 # Test copying an executable.
471
472 proc copy_executable { prog flags test1 test2 } {
473     global test_prog
474
475     if [is_remote host] {
476         set testfile [remote_download host tmpdir/$test_prog]
477         set testcopy copyprog
478     } else {
479         set testfile tmpdir/$test_prog
480         set testcopy tmpdir/copyprog
481     }
482     remote_file host delete $testcopy
483
484     set exec_output [binutils_run $prog "$flags $testfile $testcopy"]
485
486     if ![string match "" $exec_output] {
487         fail $test1
488         fail $test2
489         return
490     }
491
492     if [is_remote host] {
493         remote_upload host $testcopy tmpdir/copyprog
494     }
495
496     set status [remote_exec build "cmp" "tmpdir/$test_prog tmpdir/copyprog"]
497     set exec_output [lindex $status 1]
498
499     if [string match "" $exec_output] then {
500         pass $test1
501     } else {
502         send_log "$exec_output\n"
503         verbose "$exec_output"
504
505         # This will fail for many reasons.  For example, it will most
506         # likely fail if a non-GNU linker is used.  Therefore, we do
507         # not insist that it pass.  If you are using an assembler and
508         # linker based on the same BFD as objcopy, it is worth
509         # investigating to see why this failure occurs.  If we are
510         # cross compiling, we assume that a GNU linker is being used,
511         # and expect it to succeed.
512         if {[isnative]} then {
513             setup_xfail "*-*-*"
514         }
515
516         # This also fails for mips*-*-elf targets.  See elf32-mips.c
517         # mips_elf_sym_is_global.
518         setup_xfail "mips*-*-elf"
519
520         setup_xfail "*arm*-*-coff"
521         setup_xfail "xscale-*-coff"
522         setup_xfail "arm*-*-pe"
523         setup_xfail "thumb*-*-coff"
524         setup_xfail "thumb*-*-pe"
525     
526         fail $test1
527     }
528
529     set output [remote_load target tmpdir/copyprog]
530     set status [lindex $output 0]
531     if { $status != "pass" } {
532         fail $test2
533     } else {
534         pass $test2
535     }
536 }
537
538 # Test stripping an executable
539
540 proc strip_executable { prog flags test } {
541     global NM
542     global NMFLAGS
543
544     remote_download build tmpdir/copyprog tmpdir/striprog
545     if [is_remote host] {
546         set copyfile [remote_download host tmpdir/striprog]
547     } else {
548         set copyfile tmpdir/striprog
549     }
550
551     set exec_output [binutils_run $prog "$flags ${copyfile}"]
552     if ![string match "" $exec_output] {
553         fail $test
554         return
555     }
556
557     if [is_remote host] {
558         remote_upload host ${copyfile} tmpdir/striprog
559     }
560
561     set result [remote_load target tmpdir/striprog]
562     set status [lindex $result 0]
563     if { $status != "pass" } {
564         fail $test
565         return
566     }
567
568     set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
569     if ![string match "*: no symbols*" $exec_output] {
570         fail $test
571         return
572     }
573     pass $test
574 }
575
576 # Test stripping an executable with saving a symbol
577
578 proc strip_executable_with_saving_a_symbol { prog flags test } {
579     global NM
580     global NMFLAGS
581
582     remote_download build tmpdir/copyprog tmpdir/striprog
583     if [is_remote host] {
584         set copyfile [remote_download host tmpdir/striprog]
585     } else {
586         set copyfile tmpdir/striprog
587     }
588
589     set exec_output [binutils_run $prog "$flags ${copyfile}"]
590     if ![string match "" $exec_output] {
591         fail $test
592         return
593     }
594
595     if [is_remote host] {
596         remote_upload host ${copyfile} tmpdir/striprog
597     }
598
599     set result [remote_load target tmpdir/striprog]
600     set status [lindex $result 0]
601     if { $status != "pass" } {
602         fail $test
603         return
604     }
605
606     set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
607     if { [istarget mmix-knuth-mmixware] } {
608         # Whenever there's a symbol in the mmo format, there's the symbol
609         # Main, so remove it manually from the expected output for sake of
610         # this test.
611
612         # Using "" not {} to get the \n and \r translated.
613         regsub "^\[0-9a-fA-F\]+\[ \]+T Main\[\n\r\]+" $exec_output "" exec_output
614     }
615
616     if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
617          && ![regexp {^([0-9a-fA-F]+)?[ ]+[TD] _main} $exec_output]} {
618         fail $test
619         return
620     }
621     pass $test
622 }
623
624 set test1 "simple objcopy of executable"
625 set test2 "run objcopy of executable"
626 set test3 "run stripped executable"
627 set test4 "run stripped executable with saving a symbol"
628
629 switch [copy_setup] {
630     "1" {
631         # do nothing
632     }
633     "2" {
634         untested $test1
635         untested $test2
636         untested $test3
637         untested $test4
638     }
639     "3" {
640         unresolved $test1
641         unresolved $test2
642         unresolved $test3
643         unresolved $test4
644     }
645     "0" {
646         copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" "$test2"
647         strip_executable "$STRIP" "$STRIPFLAGS" "$test3"
648         strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test4"
649     }
650 }