btrace: indicate speculative execution
[deliverable/binutils-gdb.git] / binutils / testsuite / binutils-all / objcopy.exp
... / ...
CommitLineData
1# Copyright (C) 1994-2015 Free Software Foundation, Inc.
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program; if not, write to the Free Software
15# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
16
17# Please email any bugs, comments, and/or additions to this file to:
18# bug-dejagnu@prep.ai.mit.edu
19
20# Written by Ian Lance Taylor <ian@cygnus.com>
21
22if ![is_remote host] {
23 if {[which $OBJCOPY] == 0} then {
24 perror "$OBJCOPY does not exist"
25 return
26 }
27}
28
29send_user "Version [binutil_version $OBJCOPY]"
30
31if ![is_remote host] {
32 set tempfile tmpdir/bintest.o
33 set copyfile tmpdir/copy
34} else {
35 set tempfile [remote_download host tmpdir/bintest.o]
36 set copyfile copy
37}
38
39# Test that objcopy does not modify a file when copying it.
40
41proc objcopy_test {testname srcfile} {
42 global OBJCOPY
43 global OBJCOPYFLAGS
44 global srcdir
45 global subdir
46 global tempfile
47 global copyfile
48
49 if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
50 perror "unresolved $testname"
51 unresolved "objcopy ($testname)"
52 return
53 }
54
55 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $tempfile ${copyfile}.o"]
56
57 if ![string match "" $got] then {
58 fail "objcopy ($testname)"
59 } else {
60 send_log "cmp $tempfile ${copyfile}.o\n"
61 verbose "cmp $tempfile ${copyfile}.o"
62 if [is_remote host] {
63 set src1 tmpdir/bintest.o
64 set src2 tmpdir/copy.o
65 remote_upload host $tempfile $src1
66 remote_upload host ${copyfile}.o $src2
67 } else {
68 set src1 ${tempfile}
69 set src2 ${copyfile}.o
70 }
71 set status [remote_exec build cmp "${src1} ${src2}"]
72 set exec_output [lindex $status 1]
73 set exec_output [prune_warnings $exec_output]
74
75 # On some systems the result of objcopy will not be identical.
76 # Usually this is just because gas isn't using bfd to write the
77 # files in the first place, and may order things a little
78 # differently. Those systems should use setup_xfail here.
79
80 setup_xfail "h8300-*-coff"
81 setup_xfail "h8500-*-rtems*" "h8500-*-coff"
82 setup_xfail "hppa*-*-*"
83 setup_xfail "i960-*"
84 setup_xfail "m68*-*-*coff" "m68*-*-hpux*" "m68*-*-lynxos*"
85 setup_xfail "m68*-*-sysv*" "m68*-apple-aux*"
86 setup_xfail "m8*-*"
87 setup_xfail "sh-*-coff*"
88 setup_xfail "tic80-*-*" "w65-*"
89
90 clear_xfail "hppa*64*-*-hpux*" "hppa*-*-linux*" "hppa*-*-lites*"
91 clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-rtems*" "*-*-*elf*"
92 clear_xfail "m68*-*-sysv4*"
93
94 if [string match "" $exec_output] then {
95 pass "objcopy ($testname)"
96 } else {
97 send_log "$exec_output\n"
98 verbose "$exec_output" 1
99
100 # On OSF/1, this succeeds with gas and fails with /bin/as.
101 setup_xfail "alpha*-*-osf*"
102
103 fail "objcopy ($testname)"
104 }
105 }
106}
107
108objcopy_test "simple copy" bintest.s
109
110# Test reversing bytes in a section.
111
112set reversed ${tempfile}-reversed
113set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j .data --reverse-bytes=4 $tempfile $reversed"]
114
115if ![string match "" $got] then {
116 fail "objcopy --reverse-bytes"
117} else {
118 if [is_remote host] {
119 remote_upload host ${reversed} tmpdir/copy-reversed.o
120 set reversed tmpdir/copy-reversed.o
121 }
122
123 set origdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $tempfile"]
124 set revdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $reversed"]
125
126 set want "^ \[0-9\]+ (\[0-9\]+)"
127 set found_orig [regexp -lineanchor $want $origdata -> origdata]
128 set found_rev [regexp -lineanchor $want $revdata -> revdata]
129
130 if {$found_orig == 0 || $found_rev == 0} then {
131 # som doesn't have a .data section
132 setup_xfail "hppa*-*-hpux*"
133 clear_xfail "hppa*64*-*-hpux*"
134
135 fail "objcopy --reverse-bytes"
136 } else {
137 scan $origdata "%2x%2x%2x%2x" b1 b2 b3 b4
138 scan $revdata "%2x%2x%2x%2x" c4 c3 c2 c1
139
140 if {$b1 == $c1 && $b2 == $c2 && $b3 == $c3 && $b4 == $c4} then {
141 pass "objcopy --reverse-bytes"
142 } else {
143 fail "objcopy --reverse-bytes"
144 }
145 }
146}
147
148# Test interleaved copy of multiple byte width
149
150set sequence_file sequence_file
151set file [open ${sequence_file} w]
152puts ${file} "12345678"
153close ${file}
154
155if [is_remote host] {
156 remote_upload host ${sequence_file} tmpdir/sequence_file
157 set sequence_file tmpdir/sequence_file
158}
159
160set got [binutils_run $OBJCOPY "-I binary -i 4 -b 0 --interleave-width 2 ${sequence_file} ${copyfile}"]
161
162if ![string match "" $got] then {
163 fail "objcopy -i --interleave-width"
164} else {
165 if [is_remote host] {
166 remote_upload host ${copyfile} tmpdir/interleave_output
167 set interleave_output tmpdir/interleave_output
168 } else {
169 set interleave_output ${copyfile}
170 }
171
172 set file [open ${interleave_output} r]
173 gets $file line
174 send_log "$line\n"
175 verbose $line
176
177 if ![string match "1256" $line] then {
178 fail "objcopy -i --interleave-width"
179 }
180 pass "objcopy -i --interleave-width"
181
182 close $file
183}
184
185# Test generating S records.
186
187# We make the srec filename 8.3 compatible. Note that the header string
188# matched against depends on the name of the file. Ugh.
189
190if [is_remote host] {
191 set srecfile copy.sre
192 set header_string S00B0000636F70792E737265C1
193} else {
194 set srecfile ${copyfile}.srec
195 set header_string S0130000746D706469722F636F70792E7372656397
196}
197
198set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"]
199
200if ![string match "" $got] then {
201 fail "objcopy -O srec"
202} else {
203 if [is_remote host] {
204 remote_upload host ${srecfile} tmpdir/copy.srec
205 set srecfile tmpdir/copy.srec
206 }
207 set file [open ${srecfile} r]
208
209 # The first S record is fixed by the file name we are using.
210 gets $file line
211 send_log "$line\n"
212 verbose $line
213 if ![regexp "$header_string.*" $line] {
214 send_log "bad header\n"
215 fail "objcopy -O srec"
216 } else {
217 while {[gets $file line] != -1 \
218 && [regexp "^S\[123\]\[0-9a-fA-F\]+\[\r\n\]*$" $line]} {
219 send_log "$line\n"
220 verbose $line
221 set line "**EOF**"
222 }
223 send_log "$line\n"
224 verbose $line
225 if ![regexp "^S\[789\]\[0-9a-fA-F\]+\[\r\n\]*$" $line] then {
226 send_log "bad trailer\n"
227 fail "objcopy -O srec"
228 } else {
229 if {[gets $file line] != -1} then {
230 send_log "garbage at end\n"
231 send_log "$line\n"
232 verbose $line
233 fail "objcopy -O srec"
234 } else {
235 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${srecfile}"]
236 if ![regexp "file format srec" $got] then {
237 send_log "objdump failed\n"
238 fail "objcopy -O srec"
239 } else {
240 pass "objcopy -O srec"
241 }
242 }
243 }
244 }
245
246 close $file
247}
248
249# Test setting and adjusting the start address. We only test this
250# while generating S records, because we may not be able to set the
251# start address for other object file formats, and the S record case
252# is the only useful one anyhow.
253
254set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $tempfile"]
255if ![regexp "start address (\[0-9a-fA-FxX\]+)" $got all origstart] then {
256 perror "objdump can not recognize bintest.o"
257 set origstart ""
258} else {
259 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --set-start 0x7654 $tempfile ${copyfile}.srec"]
260 if ![string match "" $got] then {
261 fail "objcopy --set-start"
262 } else {
263 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
264 if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
265 fail "objcopy --set-start"
266 } else {
267 if {$srecstart != 0x7654} then {
268 send_log "$srecstart != 0x7654\n"
269 fail "objcopy --set-start"
270 } else {
271 pass "objcopy --set-start"
272 }
273 }
274 }
275
276 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-start 0x123 $tempfile ${copyfile}.srec"]
277 if ![string match "" $got] then {
278 fail "objcopy --adjust-start"
279 } else {
280 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
281 if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
282 fail "objcopy --adjust-start"
283 } else {
284 if {$srecstart != $origstart + 0x123} then {
285 send_log "$srecstart != $origstart + 0x123\n"
286 fail "objcopy --adjust-start"
287 } else {
288 pass "objcopy --adjust-start"
289 }
290 }
291 }
292}
293
294# Test adjusting the overall VMA, and adjusting the VMA of a
295# particular section. We again only test this when generating S
296# records.
297
298set low ""
299set lowname ""
300
301set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"]
302
303set headers_regexp "\[ 0-9\]+(\[^ \]+)\[ \]*(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+2\[*\]\[*\]\[0-9\]+(.*)"
304
305set got $headers
306while {[regexp $headers_regexp $got all name size vma rest]} {
307 set vma 0x$vma
308 set size 0x$size
309 if {$size != 0} {
310 if {$low == "" || $vma < $low} {
311 set low $vma
312 set lowname $name
313 }
314 }
315 set got $rest
316}
317
318if {$low == "" || $origstart == ""} then {
319 perror "objdump can not recognize bintest.o"
320} else {
321 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-vma 0x123 $tempfile ${copyfile}.srec"]
322 if ![string match "" $got] then {
323 fail "objcopy --adjust-vma"
324 } else {
325 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -fh ${copyfile}.srec"]
326 set want "file format srec.*start address\[ \]*(\[0-9a-fA-FxX\]+).*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
327 if ![regexp $want $got all start vma] then {
328 fail "objcopy --adjust-vma"
329 } else {
330 set vma 0x$vma
331 if {$vma != $low + 0x123} then {
332 send_log "$vma != $low + 0x123\n"
333 fail "objcopy --adjust-vma"
334 } else {
335 if {$start != $origstart + 0x123} then {
336 send_log "$start != $origstart + 0x123\n"
337 fail "objcopy --adjust-vma"
338 } else {
339 pass "objcopy --adjust-vma"
340 }
341 }
342 }
343 }
344
345 set arg ""
346 set got $headers
347 while {[regexp $headers_regexp $got all name size vma rest]} {
348 set vma 0x$vma
349 if {$vma == $low} then {
350 set arg "$arg --adjust-section-vma $name+4"
351 }
352 set got $rest
353 }
354
355 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $arg $tempfile ${copyfile}.srec"]
356 if ![string match "" $got] then {
357 fail "objcopy --adjust-section-vma +"
358 } else {
359 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
360 set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
361 if ![regexp $want $got all vma] then {
362 fail "objcopy --adjust-section-vma +"
363 } else {
364 set vma 0x$vma
365 if {$vma != $low + 4} then {
366 send_log "$vma != $low + 4\n"
367 fail "objcopy --adjust-section-vma +"
368 } else {
369 pass "objcopy --adjust-section-vma +"
370 }
371 }
372 }
373
374 regsub -all "\\+4" $arg "=[expr $low + 4]" argeq
375 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $argeq $tempfile ${copyfile}.srec"]
376 if ![string match "" $got] then {
377 fail "objcopy --adjust-section-vma ="
378 } else {
379 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
380 set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
381 if ![regexp $want $got all vma] then {
382 fail "objcopy --adjust-section-vma ="
383 } else {
384 set vma 0x$vma
385 if {$vma != $low + 4} then {
386 send_log "$vma != $low + 4\n"
387 fail "objcopy --adjust-section-vma ="
388 } else {
389 pass "objcopy --adjust-section-vma ="
390 }
391 }
392 }
393}
394
395# Test stripping an object.
396
397proc strip_test { } {
398 global AR
399 global CC
400 global STRIP
401 global STRIPFLAGS
402 global NM
403 global NMFLAGS
404 global srcdir
405 global subdir
406 global READELF
407
408 set test "strip"
409
410 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
411 untested $test
412 return
413 }
414
415 set osabi_fail "false"
416 if [is_elf_format] {
417 verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.in"
418 set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.in"]
419 if { [lindex $exec_output 0] != 0 } then {
420 unresolved "$test preserving OS/ABI"
421 set osabi_fail "true"
422 } else {
423 verbose -log "grep OS/ABI tmpdir/osabi.in"
424 catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
425 }
426 }
427
428 if [is_remote host] {
429 set archive libstrip.a
430 set objfile [remote_download host tmpdir/testprog.o]
431 remote_file host delete $archive
432 } else {
433 set archive tmpdir/libstrip.a
434 set objfile tmpdir/testprog.o
435 }
436
437 remote_file build delete tmpdir/libstrip.a
438
439 set exec_output [binutils_run $AR "rc $archive ${objfile}"]
440 if ![string match "" $exec_output] {
441 fail $test
442 unresolved "$test preserving OS/ABI"
443 return
444 }
445
446 set exec_output [binutils_run $STRIP "-g $archive"]
447 if ![string match "" $exec_output] {
448 fail $test
449 unresolved "$test preserving OS/ABI"
450 return
451 }
452
453 set exec_output [binutils_run $STRIP "$STRIPFLAGS $archive"]
454 if ![string match "" $exec_output] {
455 fail $test
456 unresolved "$test preserving OS/ABI"
457 return
458 }
459
460 if { $osabi_fail != "true" && [is_elf_format] } {
461 verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.out"
462 set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.out"]
463 if { [lindex $exec_output 0] != 0 } then {
464 unresolved "$test preserving OS/ABI"
465 } else {
466 verbose -log "grep OS/ABI tmpdir/osabi.out"
467 catch "exec grep OS/ABI tmpdir/osabi.out" osabi_out
468 if { "$osabi_in" == "$osabi_out" } {
469 pass "$test preserving OS/ABI"
470 } else {
471 fail "$test preserving OS/ABI"
472 }
473 }
474 }
475
476 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
477 untested $test
478 return
479 }
480
481 if [is_remote host] {
482 set objfile [remote_download host tmpdir/testprog.o]
483 } else {
484 set objfile tmpdir/testprog.o
485 }
486
487 set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"]
488 if ![string match "" $exec_output] {
489 fail $test
490 return
491 }
492
493 set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"]
494 if ![string match "*: no symbols*" $exec_output] {
495 fail $test
496 return
497 }
498
499 pass $test
500}
501
502strip_test
503
504# Test stripping an object file with saving a symbol
505
506proc strip_test_with_saving_a_symbol { } {
507 global CC
508 global STRIP
509 global STRIPFLAGS
510 global NM
511 global NMFLAGS
512 global srcdir
513 global subdir
514
515 set test "strip with saving a symbol"
516
517 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
518 untested $test
519 return
520 }
521
522 if [is_remote host] {
523 set objfile [remote_download host tmpdir/testprog.o]
524 } else {
525 set objfile tmpdir/testprog.o
526 }
527
528 set exec_output [binutils_run $STRIP "$STRIPFLAGS -K main -K _main $objfile"]
529 if ![string match "" $exec_output] {
530 fail $test
531 return
532 }
533
534 set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
535 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
536 && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} {
537 fail $test
538 return
539 }
540
541 pass $test
542}
543
544strip_test_with_saving_a_symbol
545
546# Build a final executable.
547
548if { [istarget *-*-cygwin] || [istarget *-*-mingw*] } {
549 set test_prog "testprog.exe"
550} else {
551 set test_prog "testprog"
552}
553
554proc copy_setup { } {
555 global srcdir
556 global subdir
557 global gcc_gas_flag
558 global test_prog
559 global host_triplet
560
561 set res [build_wrapper testglue.o]
562 set flags { debug }
563
564 if { [istarget *-*-uclinux*] && ![istarget tic6x-*-*] } {
565 return 1
566 }
567
568 if { $res != "" } {
569 lappend flags "additional_flags=[lindex $res 1]"
570 set add_libs "testglue.o"
571 } else {
572 set add_libs ""
573 }
574
575 if { [istarget *-*-linux*]
576 || [istarget *-*-gnu*] } {
577 foreach i $gcc_gas_flag {
578 set flags "additional_flags=$i $flags"
579 }
580 }
581 if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/$test_prog executable $flags] != "" } {
582 return 2
583 }
584
585 set result [remote_load target tmpdir/$test_prog]
586 set status [lindex $result 0]
587
588 if { $status != "pass" } {
589 send_log "cannot run executable, status = ${status} on ${host_triplet}\n"
590 if { [istarget $host_triplet] } {
591 return 3
592 }
593 set status "pass"
594 }
595
596 return 0
597}
598
599# Test copying an executable.
600
601proc copy_executable { prog flags test1 test2 } {
602 global test_prog
603 global host_triplet
604
605 if [is_remote host] {
606 set testfile [remote_download host tmpdir/$test_prog]
607 set testcopy copyprog
608 } else {
609 set testfile tmpdir/$test_prog
610 set testcopy tmpdir/copyprog
611 }
612 remote_file host delete $testcopy
613
614 set exec_output [binutils_run $prog "$flags $testfile $testcopy"]
615
616 if ![string match "" $exec_output] {
617 fail $test1
618 if [string match "" $test2] {
619 return
620 }
621 fail $test2
622 return
623 }
624
625 if [is_remote host] {
626 remote_upload host $testcopy tmpdir/copyprog
627 }
628
629 set status [remote_exec build "cmp" "tmpdir/$test_prog tmpdir/copyprog"]
630 set exec_output [lindex $status 1]
631
632 if [string match "" $exec_output] then {
633 pass $test1
634 } else {
635 send_log "$exec_output\n"
636 verbose "$exec_output"
637
638 # This will fail for many reasons. For example, it will most
639 # likely fail if a non-GNU linker is used. Therefore, we do
640 # not insist that it pass. If you are using an assembler and
641 # linker based on the same BFD as objcopy, it is worth
642 # investigating to see why this failure occurs. If we are
643 # cross compiling, we assume that a GNU linker is being used,
644 # and expect it to succeed.
645 if {[isnative]} then {
646 setup_xfail "*-*-*"
647 }
648
649 # This also fails for mips*-*-elf targets. See elf32-mips.c
650 # mips_elf_sym_is_global.
651 setup_xfail "mips*-*-elf"
652
653 setup_xfail "arm*-*-coff"
654 setup_xfail "arm*-*-pe"
655 setup_xfail "*-*-mingw*"
656 setup_xfail "*-*-cygwin*"
657
658 fail $test1
659 }
660
661 if [string match "" $test2] {
662 return
663 }
664
665 set output [remote_load target tmpdir/copyprog]
666 set status [lindex $output 0]
667 if { ![istarget $host_triplet] } {
668 set status "pass"
669 }
670 if { $status != "pass" } {
671 fail $test2
672 } else {
673 pass $test2
674 }
675}
676
677# Test stripping an executable
678
679proc strip_executable { prog flags test } {
680 global NM
681 global NMFLAGS
682 global READELF
683 global host_triplet
684
685 remote_file build delete tmpdir/striprog
686 remote_download build tmpdir/copyprog tmpdir/striprog
687 if [is_remote host] {
688 set copyfile [remote_download host tmpdir/striprog]
689 } else {
690 set copyfile tmpdir/striprog
691 }
692
693 set osabi_fail "false"
694 if [is_elf_format] {
695 verbose -log "$READELF -a ${copyfile} > tmpdir/osabi.in"
696 set exec_output [remote_exec host "$READELF -h ${copyfile}" "" "/dev/null" "tmpdir/osabi.in"]
697 if { [lindex $exec_output 0] != 0 } then {
698 unresolved "$test preserving OS/ABI"
699 set osabi_fail "true"
700 } else {
701 verbose -log "grep OS/ABI tmpdir/osabi.in"
702 catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
703 }
704 }
705
706 set exec_output [binutils_run $prog "$flags ${copyfile}"]
707 if ![string match "" $exec_output] {
708 fail $test
709 return
710 }
711
712 if [is_remote host] {
713 remote_upload host ${copyfile} tmpdir/striprog
714 }
715
716 set result [remote_load target tmpdir/striprog]
717 set status [lindex $result 0]
718 if { ![istarget $host_triplet] } {
719 set status "pass"
720 }
721 if { $status != "pass" } {
722 fail $test
723 return
724 }
725
726 if { $osabi_fail != "true" && [is_elf_format] } {
727 verbose -log "$READELF -a ${copyfile} > tmpdir/osabi.out"
728 set exec_output [remote_exec host "$READELF -h ${copyfile}" "" "/dev/null" "tmpdir/osabi.out"]
729 if { [lindex $exec_output 0] != 0 } then {
730 unresolved "$test preserving OS/ABI"
731 } else {
732 verbose -log "grep OS/ABI tmpdir/osabi.out"
733 catch "exec grep OS/ABI tmpdir/osabi.out" osabi_out
734 if { "$osabi_in" == "$osabi_out" } {
735 pass "$test preserving OS/ABI"
736 } else {
737 fail "$test preserving OS/ABI"
738 }
739 }
740 }
741
742 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
743 if ![string match "*: no symbols*" $exec_output] {
744 fail $test
745 return
746 }
747 pass $test
748}
749
750# Test stripping an executable with saving a symbol
751
752proc strip_executable_with_saving_a_symbol { prog flags test } {
753 global NM
754 global NMFLAGS
755 global host_triplet
756
757 remote_file build delete tmpdir/striprog
758 remote_download build tmpdir/copyprog tmpdir/striprog
759 if [is_remote host] {
760 set copyfile [remote_download host tmpdir/striprog]
761 } else {
762 set copyfile tmpdir/striprog
763 }
764
765 set exec_output [binutils_run $prog "$flags ${copyfile}"]
766 if ![string match "" $exec_output] {
767 fail $test
768 return
769 }
770
771 if [is_remote host] {
772 remote_upload host ${copyfile} tmpdir/striprog
773 }
774
775 set result [remote_load target tmpdir/striprog]
776 set status [lindex $result 0]
777 if { ![istarget $host_triplet] } {
778 set status "pass"
779 }
780 if { $status != "pass" } {
781 fail $test
782 return
783 }
784
785 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
786 if { [istarget mmix-knuth-mmixware] } {
787 # Whenever there's a symbol in the mmo format, there's the symbol
788 # Main, so remove it manually from the expected output for sake of
789 # this test.
790
791 # Using "" not {} to get the \n and \r translated.
792 regsub "^\[0-9a-fA-F\]+\[ \]+T Main\[\n\r\]+" $exec_output "" exec_output
793 }
794
795 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
796 && ![regexp {^([0-9a-fA-F]+)?[ ]+[TD] _main} $exec_output]} {
797 fail $test
798 return
799 }
800 pass $test
801}
802
803# Test keeping only debug symbols of an executable
804
805proc keep_debug_symbols_and_test_copy { prog1 flags1 test1 prog2 flags2 test2 } {
806 global NM
807 global NMFLAGS
808
809 remote_file build delete tmpdir/striprog
810 remote_download build tmpdir/copyprog tmpdir/striprog
811 if [is_remote host] {
812 set copyfile [remote_download host tmpdir/striprog]
813 } else {
814 set copyfile tmpdir/striprog
815 }
816
817 set exec_output [binutils_run $prog1 "$flags1 ${copyfile}"]
818 if ![string match "" $exec_output] {
819 fail $test1
820 return
821 }
822 pass $test1
823
824 set exec_output [binutils_run $prog2 "$flags2 ${copyfile}"]
825 if ![string match "" $exec_output] {
826 fail $test2
827 return
828 }
829 pass $test2
830}
831
832# Tests that in a debug only copy of a file the sections
833# headers whoes types have been changed to NOBITS still
834# retain their sh_link fields.
835
836proc keep_debug_symbols_and_check_links { prog flags test } {
837 global READELF
838
839 remote_file build delete tmpdir/striprog
840 remote_download build tmpdir/copyprog tmpdir/striprog
841 if [is_remote host] {
842 set copyfile [remote_download host tmpdir/striprog]
843 } else {
844 set copyfile tmpdir/striprog
845 }
846
847 set exec_output [binutils_run $prog "$flags ${copyfile}"]
848 if ![string match "" $exec_output] {
849 fail $test
850 return
851 }
852
853 set got [binutils_run $READELF "-S --wide ${copyfile}"]
854
855 set fails 0
856 # Regexp to match a section with NOBITS type and extract its name and sh_link fields
857 while {[regexp \
858 {[^a-zA-Z]+([a-zA-Z0-9_\.]+)[ ]+NOBITS[ ]+[0-9a-fA-F]+ [0-9a-fA-F]+ [0-9a-fA-F]+ [0-9]+[ A]+([0-9]+)(.*)} \
859 $got all name link rest]} {
860 set sh_link 0x$link
861 if {$sh_link == 0} {
862 # Only some NOBITS sections should have a non-zero sh_link field.
863 # Look for them by name.
864 verbose "NOBITS section .$name has a 0 sh_link field\n"
865 switch $name {
866 "rela.*" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
867 "rel.*" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
868 "hash" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
869 "gnu_version" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
870 "dynsym" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
871 "gnu.version_r" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
872 "dynamic" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
873 "symtab" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
874 }
875 }
876 set got $rest
877 }
878
879 if {$fails == 0} {
880 pass $test
881 } else {
882 fail $test
883 }
884}
885
886
887set test1 "simple objcopy of executable"
888set test2 "run objcopy of executable"
889set test3 "run stripped executable"
890set test4 "run stripped executable with saving a symbol"
891set test5 "keep only debug data"
892set test6 "simple objcopy of debug data"
893if [is_elf_format] {
894 set test7 "NOBITS sections retain sh_link field"
895}
896
897switch [copy_setup] {
898 "1" {
899 # do nothing
900 }
901 "2" {
902 untested $test1
903 untested $test2
904 untested $test3
905 untested $test4
906 untested $test5
907 untested $test6
908 if [is_elf_format] {
909 untested $test7
910 }
911 }
912 "3" {
913 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" ""
914 unsupported $test2
915 unsupported $test3
916 unsupported $test4
917 unsupported $test5
918 unsupported $test6
919 if [is_elf_format] {
920 unsupported $test7
921 }
922 }
923 "0" {
924 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" "$test2"
925 strip_executable "$STRIP" "$STRIPFLAGS" "$test3"
926 strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test4"
927 keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test5" \
928 "$OBJCOPY" "$OBJCOPYFLAGS" "$test6"
929 if [is_elf_format] {
930 keep_debug_symbols_and_check_links "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test7"
931 }
932 }
933}
934
935proc objcopy_test_readelf {testname srcfile} {
936 global OBJCOPY
937 global OBJCOPYFLAGS
938 global READELF
939 global srcdir
940 global subdir
941
942 if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
943 unresolved "objcopy ($testname)"
944 return
945 }
946
947 verbose -log "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"
948 set exec_output [remote_exec host "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"]
949 if { [lindex $exec_output 0] != 0
950 || ![string match "" [lindex $exec_output 1]] } then {
951 fail "objcopy ($testname)"
952 return
953 }
954
955 verbose -log "$READELF -a tmpdir/bintest.o > tmpdir/bintest.o.out"
956 set exec_output [remote_exec host "$READELF -a tmpdir/bintest.o" "" "/dev/null" "tmpdir/bintest.o.out"]
957 if { [lindex $exec_output 0] != 0 } then {
958 unresolved "objcopy ($testname)"
959 return
960 }
961 set exec_output [prune_warnings [lindex $exec_output 1]]
962 if ![string match "" $exec_output] then {
963 unresolved "objcopy ($testname)"
964 return
965 }
966
967 verbose -log "$READELF -a tmpdir/copy.o > tmpdir/copy.o.out"
968 set exec_output [remote_exec host "$READELF -a tmpdir/copy.o" "" "/dev/null" "tmpdir/copy.o.out"]
969 if { [lindex $exec_output 0] != 0 } then {
970 unresolved "objcopy ($testname)"
971 return
972 }
973 set exec_output [prune_warnings [lindex $exec_output 1]]
974 if ![string match "" $exec_output] then {
975 unresolved "objcopy ($testname)"
976 return
977 }
978
979 verbose -log "diff tmpdir/bintest.o.out tmpdir/copy.o.out"
980 catch "exec diff tmpdir/bintest.o.out tmpdir/copy.o.out" exec_output
981 set exec_output [prune_warnings $exec_output]
982
983 if [string match "" $exec_output] then {
984 pass "objcopy ($testname)"
985 } else {
986 fail "objcopy ($testname)"
987 }
988}
989
990# ia64 specific tests
991if { ([istarget "ia64-*-elf*"]
992 || [istarget "ia64-*-linux*"]) } {
993 objcopy_test "ia64 link order" link-order.s
994}
995
996# ELF specific tests
997if [is_elf_format] {
998 objcopy_test "ELF unknown section type" unknown.s
999 objcopy_test_readelf "ELF group" group.s
1000 objcopy_test_readelf "ELF group" group-2.s
1001 objcopy_test_readelf "ELF group" group-3.s
1002 objcopy_test_readelf "ELF group" group-4.s
1003 run_dump_test "group-5"
1004 run_dump_test "group-6"
1005 run_dump_test "copy-1"
1006 run_dump_test "note-1"
1007}
1008
1009run_dump_test "copy-2"
1010run_dump_test "copy-3"
1011run_dump_test "copy-4"
1012
1013if [is_elf_format] {
1014 run_dump_test "strip-1"
1015 run_dump_test "strip-2"
1016 run_dump_test "strip-3"
1017 run_dump_test "strip-4"
1018 run_dump_test "strip-5"
1019 run_dump_test "strip-6"
1020 run_dump_test "strip-7"
1021 run_dump_test "strip-8"
1022 run_dump_test "strip-9"
1023 # Non-EABI ARM targets will set OSABI to ARM
1024 # The V850 sets the OSABI to UNIX - System V
1025 if { ![istarget "*-*-hpux*"]
1026 && ![istarget "msp*-*-*"]
1027 && ![istarget "visium-*-*"]
1028 && ![istarget "v850*-*-*"]
1029 && !([istarget "arm*-*-*"] && ![istarget "arm-*-*eabi*"])} {
1030 run_dump_test "strip-10"
1031 }
1032 set extra_strip11 ""
1033 if { [istarget "sh64*-*"] } {
1034 # pr17755 testcase
1035 set extra_strip11 { { "as" "--isa=SHmedia --abi=64" } }
1036 }
1037 run_dump_test "strip-11" $extra_strip11
1038
1039 if { [istarget "i*86-*"] || [istarget "x86_64-*-*"] } {
1040 # Check to make sure we don't strip a symbol named in relocations.
1041 set test "objcopy keeps symbols needed by relocs"
1042
1043 set srcfile $srcdir/$subdir/needed-by-reloc.s
1044
1045 if {![binutils_assemble $srcfile tmpdir/bintest.o]} then {
1046 unresolved $test
1047 } else {
1048 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-symbol=foo tmpdir/bintest.o ${copyfile}.o"]
1049
1050 if [regexp "not stripping symbol `foo' because it is named in a relocation" $got] {
1051 pass $test
1052 } else {
1053 fail $test
1054 }
1055 }
1056 }
1057
1058 # The symbol table for some MIPS targets is sorted differently than
1059 # the ELF canonical order, so the regexps in localize-hidden-1.d fail
1060 # to match. These tests must be matched to targets for which
1061 # targ_defvec=mips_elf32_be_vec,
1062 # targ_defvec=mips_elf32_le_vec,
1063 # targ_defvec=mips_elf32_n_be_vec or
1064 # targ_defvec=mips_elf32_n_le_vec in config.bfd. When syncing,
1065 # don't forget that earlier case-matches trump later ones.
1066 if { ![istarget "mips*-sde-elf*"] && ![istarget "mips*-mti-elf*"]
1067 && ![istarget "mips*-img-elf*"]
1068 && ![istarget "mips64*-*-openbsd*"] } {
1069 setup_xfail "mips*-*-irix5*" "mips*-*-irix6*" "mips*-*-elf*" \
1070 "mips*-*-rtems*" "mips*-*-windiss" "mips*-*-none" \
1071 "mips*-*-openbsd*" "mips*-*-chorus*"
1072 }
1073 run_dump_test "localize-hidden-1"
1074 run_dump_test "testranges"
1075 run_dump_test "testranges-ia64"
1076
1077 run_dump_test "add-section"
1078 run_dump_test "add-empty-section"
1079
1080 run_dump_test "exclude-1a"
1081 run_dump_test "exclude-1b"
1082}
1083run_dump_test "localize-hidden-2"
This page took 0.027134 seconds and 4 git commands to generate.