1 # Copyright (C) 1994-2019 Free Software Foundation, Inc.
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.
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.
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.
17 # Please email any bugs, comments, and/or additions to this file to:
18 # bug-dejagnu@prep.ai.mit.edu
20 # Written by Ian Lance Taylor <ian@cygnus.com>
22 if ![is_remote host] {
23 if {[which $OBJCOPY] == 0} then {
24 perror "$OBJCOPY does not exist"
29 send_user "Version [binutil_version $OBJCOPY]"
31 if ![is_remote host] {
32 set tempfile tmpdir/bintest.o
33 set copyfile tmpdir/copy
35 set tempfile [remote_download host tmpdir/bintest.o]
39 # Test that objcopy does not modify a file when copying it.
41 proc objcopy_test {testname srcfile} {
49 if {![binutils_assemble $srcdir/$subdir/${srcfile} $tempfile]} then {
50 unresolved "objcopy ($testname)"
51 remote_file host delete $tempfile
55 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $tempfile ${copyfile}.o"]
57 if ![string equal "" $got] then {
58 fail "objcopy ($testname)"
60 send_log "cmp $tempfile ${copyfile}.o\n"
61 verbose "cmp $tempfile ${copyfile}.o"
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
69 set src2 ${copyfile}.o
71 set status [remote_exec build cmp "${src1} ${src2}"]
72 set exec_output [lindex $status 1]
73 set exec_output [prune_warnings $exec_output]
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.
80 setup_xfail "hppa*-*-*"
82 setup_xfail "sh-*-coff*"
83 setup_xfail "tic54x-*-*"
84 setup_xfail "tic80-*-*"
86 clear_xfail "hppa*64*-*-hpux*" "hppa*-*-linux*" "hppa*-*-lites*"
87 clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-rtems*" "*-*-*elf*"
89 if [string equal "" $exec_output] then {
90 pass "objcopy ($testname)"
92 send_log "$exec_output\n"
93 verbose "$exec_output" 1
95 # On OSF/1, this succeeds with gas and fails with /bin/as.
96 setup_xfail "alpha*-*-osf*"
98 fail "objcopy ($testname)"
103 objcopy_test "simple copy" bintest.s
105 # Test verilog data width
106 proc objcopy_test_verilog {testname} {
112 set binfile tmpdir/verilogtest.o
113 set verilog tmpdir/verilog
115 set got [binutils_assemble $srcdir/$subdir/verilogtest.s $binfile]
116 if {![binutils_assemble $srcdir/$subdir/verilogtest.s $binfile]} then {
117 unresolved "objcopy ($testname)"
121 set got [binutils_run $OBJCOPY "-O verilog $binfile $verilog"]
122 if ![string equal "" $got] then {
123 fail "objcopy ($testname)"
126 set got [binutils_run $OBJCOPY "-O verilog --verilog-data-width 0 $binfile $verilog-0.hex"]
127 if ![regexp "verilog data width must be at least 1 byte" $got] then {
128 fail "objcopy ($testname 0) {$got}"
130 pass "objcopy ($testname 0)"
133 foreach width {1 2 4 8} {
134 set got [binutils_run $OBJCOPY "-O verilog --verilog-data-width $width $binfile $verilog-$width.hex"]
135 if ![string equal "" $got] then {
136 fail "objcopy ($testname $width)"
138 send_log "regexp_diff $verilog-$width.hex $srcdir/$subdir/verilog-$width.hex\n"
139 if {! [regexp_diff "$verilog-$width.hex" "$srcdir/$subdir/verilog-$width.hex"]} {
140 pass "objcopy ($testname $width)"
142 fail "objcopy ($testname $width)"
147 objcopy_test_verilog "verilog data width"
149 if { [file exists $tempfile] } {
150 # Test reversing bytes in a section.
152 set reversed ${tempfile}-reversed
153 set sect_names [get_standard_section_names]
154 if { $sect_names != "" } {
155 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j [lindex $sect_names 1] --reverse-bytes=4 $tempfile $reversed"]
157 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j .data --reverse-bytes=4 $tempfile $reversed"]
160 if ![string equal "" $got] then {
161 fail "objcopy --reverse-bytes"
163 if [is_remote host] {
164 remote_upload host ${reversed} tmpdir/copy-reversed.o
165 set reversed tmpdir/copy-reversed.o
168 set origdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $tempfile"]
169 set revdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $reversed"]
171 set want "^ \[0-9\]+ (\[0-9\]+)"
172 set found_orig [regexp -lineanchor $want $origdata -> origdata]
173 set found_rev [regexp -lineanchor $want $revdata -> revdata]
175 if {$found_orig == 0 || $found_rev == 0} then {
176 # som doesn't have a .data section
177 setup_xfail "hppa*-*-hpux*"
178 clear_xfail "hppa*64*-*-hpux*"
180 fail "objcopy --reverse-bytes"
182 scan $origdata "%2x%2x%2x%2x" b1 b2 b3 b4
183 scan $revdata "%2x%2x%2x%2x" c4 c3 c2 c1
185 if {$b1 == $c1 && $b2 == $c2 && $b3 == $c3 && $b4 == $c4} then {
186 pass "objcopy --reverse-bytes"
188 fail "objcopy --reverse-bytes"
194 # Test interleaved copy of multiple byte width
196 set sequence_file sequence_file
197 set file [open ${sequence_file} w]
198 puts ${file} "12345678"
201 if [is_remote host] {
202 remote_upload host ${sequence_file} tmpdir/sequence_file
203 set sequence_file tmpdir/sequence_file
206 set got [binutils_run $OBJCOPY "-I binary -i 4 -b 0 --interleave-width 2 ${sequence_file} ${copyfile}"]
208 if ![string equal "" $got] then {
209 fail "objcopy -i --interleave-width"
211 if [is_remote host] {
212 remote_upload host ${copyfile} tmpdir/interleave_output
213 set interleave_output tmpdir/interleave_output
215 set interleave_output ${copyfile}
218 set file [open ${interleave_output} r]
223 if ![string equal "1256" $line] then {
224 fail "objcopy -i --interleave-width"
226 pass "objcopy -i --interleave-width"
231 # Test generating S records.
233 if { [file exists $tempfile] } {
234 # We make the srec filename 8.3 compatible. Note that the header string
235 # matched against depends on the name of the file. Ugh.
237 if [is_remote host] {
238 set srecfile copy.sre
239 set header_string S00B0000636F70792E737265C1
241 set srecfile ${copyfile}.srec
242 set header_string S0130000746D706469722F636F70792E7372656397
245 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"]
247 if ![string equal "" $got] then {
248 fail "objcopy -O srec"
250 if [is_remote host] {
251 remote_upload host ${srecfile} tmpdir/copy.srec
252 set srecfile tmpdir/copy.srec
254 set file [open ${srecfile} r]
256 # The first S record is fixed by the file name we are using.
260 if ![regexp "$header_string.*" $line] {
261 send_log "bad header\n"
262 fail "objcopy -O srec"
264 while {[gets $file line] != -1 \
265 && [regexp "^S\[123\]\[0-9a-fA-F\]+\[\r\n\]*$" $line]} {
272 if ![regexp "^S\[789\]\[0-9a-fA-F\]+\[\r\n\]*$" $line] then {
273 send_log "bad trailer\n"
274 fail "objcopy -O srec"
276 if {[gets $file line] != -1} then {
277 send_log "garbage at end\n"
280 fail "objcopy -O srec"
282 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${srecfile}"]
283 if ![regexp "file format srec" $got] then {
284 send_log "objdump failed\n"
285 fail "objcopy -O srec"
287 pass "objcopy -O srec"
297 # Test setting and adjusting the start address. We only test this
298 # while generating S records, because we may not be able to set the
299 # start address for other object file formats, and the S record case
300 # is the only useful one anyhow.
302 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $tempfile"]
303 if ![regexp "start address (\[0-9a-fA-FxX\]+)" $got all origstart] then {
304 perror "objdump can not recognize bintest.o"
307 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --set-start 0x7654 $tempfile ${copyfile}.srec"]
308 if ![string equal "" $got] then {
309 fail "objcopy --set-start"
311 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
312 if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
313 fail "objcopy --set-start"
315 if {$srecstart != 0x7654} then {
316 send_log "$srecstart != 0x7654\n"
317 fail "objcopy --set-start"
319 pass "objcopy --set-start"
324 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-start 0x123 $tempfile ${copyfile}.srec"]
325 if ![string equal "" $got] then {
326 fail "objcopy --adjust-start"
328 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
329 if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
330 fail "objcopy --adjust-start"
332 if {$srecstart != $origstart + 0x123} then {
333 send_log "$srecstart != $origstart + 0x123\n"
334 fail "objcopy --adjust-start"
336 pass "objcopy --adjust-start"
342 # Test adjusting the overall VMA, and adjusting the VMA of a
343 # particular section. We again only test this when generating S
349 set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"]
351 set headers_regexp "\[ 0-9\]+(\[^ \]+)\[ \]*(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+2\[*\]\[*\]\[0-9\]+(.*)"
354 while {[regexp $headers_regexp $got all name size vma rest]} {
358 if {$low == "" || $vma < $low} {
366 if {$low == "" || $origstart == ""} then {
367 perror "objdump can not recognize bintest.o"
369 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-vma 0x123 $tempfile ${copyfile}.srec"]
370 if ![string equal "" $got] then {
371 fail "objcopy --adjust-vma"
373 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -fh ${copyfile}.srec"]
374 set want "file format srec.*start address\[ \]*(\[0-9a-fA-FxX\]+).*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
375 if ![regexp $want $got all start vma] then {
376 fail "objcopy --adjust-vma"
379 if {$vma != $low + 0x123} then {
380 send_log "$vma != $low + 0x123\n"
381 fail "objcopy --adjust-vma"
383 if {$start != $origstart + 0x123} then {
384 send_log "$start != $origstart + 0x123\n"
385 fail "objcopy --adjust-vma"
387 pass "objcopy --adjust-vma"
395 while {[regexp $headers_regexp $got all name size vma rest]} {
397 if {$vma == $low} then {
398 set arg "$arg --adjust-section-vma $name+4"
403 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $arg $tempfile ${copyfile}.srec"]
404 if ![string equal "" $got] then {
405 fail "objcopy --adjust-section-vma +"
407 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
408 set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
409 if ![regexp $want $got all vma] then {
410 fail "objcopy --adjust-section-vma +"
413 if {$vma != $low + 4} then {
414 send_log "$vma != $low + 4\n"
415 fail "objcopy --adjust-section-vma +"
417 pass "objcopy --adjust-section-vma +"
422 regsub -all "\\+4" $arg "=[expr $low + 4]" argeq
423 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $argeq $tempfile ${copyfile}.srec"]
424 if ![string equal "" $got] then {
425 fail "objcopy --adjust-section-vma ="
427 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
428 set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
429 if ![regexp $want $got all vma] then {
430 fail "objcopy --adjust-section-vma ="
433 if {$vma != $low + 4} then {
434 send_log "$vma != $low + 4\n"
435 fail "objcopy --adjust-section-vma ="
437 pass "objcopy --adjust-section-vma ="
443 # Test stripping an object.
445 proc strip_test { } {
458 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
463 set osabi_fail "false"
465 verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.in"
466 set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.in"]
467 if { [lindex $exec_output 0] != 0 } then {
468 unresolved "$test preserving OS/ABI"
469 set osabi_fail "true"
471 verbose -log "grep OS/ABI tmpdir/osabi.in"
472 catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
476 if [is_remote host] {
477 set archive libstrip.a
478 set objfile [remote_download host tmpdir/testprog.o]
479 remote_file host delete $archive
481 set archive tmpdir/libstrip.a
482 set objfile tmpdir/testprog.o
485 remote_file build delete tmpdir/libstrip.a
487 set exec_output [binutils_run $AR "rc $archive ${objfile}"]
488 set exec_output [prune_warnings $exec_output]
489 if ![string equal "" $exec_output] {
491 unresolved "$test preserving OS/ABI"
495 set exec_output [binutils_run $STRIP "-g $archive"]
496 set exec_output [prune_warnings $exec_output]
497 if ![string equal "" $exec_output] {
499 unresolved "$test preserving OS/ABI"
503 set exec_output [binutils_run $STRIP "$STRIPFLAGS $archive"]
504 set exec_output [prune_warnings $exec_output]
505 if ![string equal "" $exec_output] {
507 unresolved "$test preserving OS/ABI"
511 if { $osabi_fail != "true" && [is_elf_format] } {
512 verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.out"
513 set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.out"]
514 if { [lindex $exec_output 0] != 0 } then {
515 unresolved "$test preserving OS/ABI"
517 verbose -log "grep OS/ABI tmpdir/osabi.out"
518 catch "exec grep OS/ABI tmpdir/osabi.out" osabi_out
519 if { "$osabi_in" == "$osabi_out" } {
520 pass "$test preserving OS/ABI"
522 fail "$test preserving OS/ABI"
527 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
532 if [is_remote host] {
533 set objfile [remote_download host tmpdir/testprog.o]
535 set objfile tmpdir/testprog.o
538 set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"]
539 set exec_output [prune_warnings $exec_output]
540 if ![string equal "" $exec_output] {
545 set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"]
546 set exec_output [prune_warnings $exec_output]
547 if ![string match "*: no symbols*" $exec_output] {
557 # Test stripping an object file with saving a symbol
559 proc strip_test_with_saving_a_symbol { } {
568 set test "strip with saving a symbol"
570 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
575 if [is_remote host] {
576 set objfile [remote_download host tmpdir/testprog.o]
578 set objfile tmpdir/testprog.o
581 set exec_output [binutils_run $STRIP "$STRIPFLAGS -K main -K _main $objfile"]
582 set exec_output [prune_warnings $exec_output]
583 if ![string equal "" $exec_output] {
588 set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
589 set exec_output [prune_warnings $exec_output]
590 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
591 && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} {
599 strip_test_with_saving_a_symbol
601 # Build a final executable.
603 if { [istarget *-*-cygwin] || [istarget *-*-mingw*] } {
604 set test_prog "testprog.exe"
606 set test_prog "testprog"
609 proc copy_setup { } {
616 set res [build_wrapper testglue.o]
619 if { [istarget *-*-uclinux*] && ![istarget tic6x-*-*] && ![istarget arm*-*-uclinuxfdpiceabi] } {
624 lappend flags "additional_flags=[lindex $res 1]"
625 set add_libs "testglue.o"
630 if { [istarget *-*-linux*]
631 || [istarget *-*-gnu*] } {
632 foreach i $gcc_gas_flag {
633 set flags "additional_flags=$i $flags"
636 if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/$test_prog executable $flags] != "" } {
640 set result [remote_load target tmpdir/$test_prog]
641 set status [lindex $result 0]
643 if { $status != "pass" } {
644 send_log "cannot run executable, status = ${status} on ${host_triplet}\n"
651 # Test copying an executable.
653 proc copy_executable { prog flags test1 test2 } {
656 if [is_remote host] {
657 set testfile [remote_download host tmpdir/$test_prog]
658 set testcopy copyprog
660 set testfile tmpdir/$test_prog
661 set testcopy tmpdir/copyprog
663 remote_file host delete $testcopy
665 set exec_output [binutils_run $prog "$flags $testfile $testcopy"]
667 if ![string equal "" $exec_output] {
669 if [string equal "" $test2] {
676 if [is_remote host] {
677 remote_upload host $testcopy tmpdir/copyprog
680 set status [remote_exec build "cmp" "tmpdir/$test_prog tmpdir/copyprog"]
681 set exec_output [lindex $status 1]
683 if [string equal "" $exec_output] then {
686 send_log "$exec_output\n"
687 verbose "$exec_output"
689 # This will fail for many reasons. For example, it will most
690 # likely fail if a non-GNU linker is used. Therefore, we do
691 # not insist that it pass. If you are using an assembler and
692 # linker based on the same BFD as objcopy, it is worth
693 # investigating to see why this failure occurs. If we are
694 # cross compiling, we assume that a GNU linker is being used,
695 # and expect it to succeed.
696 if {[isnative]} then {
700 # This also fails for some mips targets. See elf32-mips.c
701 # mips_elf_sym_is_global.
702 if { [is_bad_symtab] } then {
706 setup_xfail "arm*-*-pe"
707 setup_xfail "*-*-mingw*"
708 setup_xfail "*-*-cygwin*"
713 if [string equal "" $test2] {
717 set output [remote_load target tmpdir/copyprog]
718 set status [lindex $output 0]
719 if { $status != "pass" } {
726 # Test stripping an executable
728 proc strip_executable { prog flags test1 test2 } {
733 remote_file build delete tmpdir/striprog
734 remote_download build tmpdir/copyprog tmpdir/striprog
735 if [is_remote host] {
736 set copyfile [remote_download host tmpdir/striprog]
738 set copyfile tmpdir/striprog
741 set osabi_fail "false"
743 verbose -log "$READELF -a ${copyfile} > tmpdir/osabi.in"
744 set exec_output [remote_exec host "$READELF -h ${copyfile}" "" "/dev/null" "tmpdir/osabi.in"]
745 if { [lindex $exec_output 0] != 0 } then {
746 unresolved "$test1 preserving OS/ABI"
747 set osabi_fail "true"
749 verbose -log "grep OS/ABI tmpdir/osabi.in"
750 catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
754 set exec_output [binutils_run $prog "$flags ${copyfile}"]
755 if ![string equal "" $exec_output] {
757 if [string equal "" $test2] {
764 if [is_remote host] {
765 remote_upload host ${copyfile} tmpdir/striprog
768 if { $osabi_fail != "true" && [is_elf_format] } {
769 verbose -log "$READELF -a ${copyfile} > tmpdir/osabi.out"
770 set exec_output [remote_exec host "$READELF -h ${copyfile}" "" "/dev/null" "tmpdir/osabi.out"]
771 if { [lindex $exec_output 0] != 0 } then {
772 unresolved "$test1 preserving OS/ABI"
774 verbose -log "grep OS/ABI tmpdir/osabi.out"
775 catch "exec grep OS/ABI tmpdir/osabi.out" osabi_out
776 if { "$osabi_in" == "$osabi_out" } {
777 pass "$test1 preserving OS/ABI"
779 fail "$test1 preserving OS/ABI"
784 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
785 if ![string match "*: no symbols*" $exec_output] {
790 if [string equal "" $test2] {
794 set result [remote_load target tmpdir/striprog]
795 set status [lindex $result 0]
796 if { $status != "pass" } {
804 # Test stripping an executable with saving a symbol
806 proc strip_executable_with_saving_a_symbol { prog flags test1 test2 } {
810 remote_file build delete tmpdir/striprog
811 remote_download build tmpdir/copyprog tmpdir/striprog
812 if [is_remote host] {
813 set copyfile [remote_download host tmpdir/striprog]
815 set copyfile tmpdir/striprog
818 set exec_output [binutils_run $prog "$flags ${copyfile}"]
819 if ![string equal "" $exec_output] {
821 if [string equal "" $test2] {
828 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
829 if { [istarget mmix-knuth-mmixware] } {
830 # Whenever there's a symbol in the mmo format, there's the symbol
831 # Main, so remove it manually from the expected output for sake of
834 # Using "" not {} to get the \n and \r translated.
835 regsub "^\[0-9a-fA-F\]+\[ \]+T Main\[\n\r\]+" $exec_output "" exec_output
838 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
839 && ![regexp {^([0-9a-fA-F]+)?[ ]+[TD] _main} $exec_output]} {
844 if [string equal "" $test2] {
848 if [is_remote host] {
849 remote_upload host ${copyfile} tmpdir/striprog
852 set result [remote_load target tmpdir/striprog]
853 set status [lindex $result 0]
854 if { $status != "pass" } {
862 # Test keeping only debug symbols of an executable
864 proc keep_debug_symbols_and_test_copy { prog1 flags1 test1 prog2 flags2 test2 } {
865 remote_file build delete tmpdir/striprog
866 remote_download build tmpdir/copyprog tmpdir/striprog
867 if [is_remote host] {
868 set copyfile [remote_download host tmpdir/striprog]
870 set copyfile tmpdir/striprog
873 set exec_output [binutils_run $prog1 "$flags1 ${copyfile}"]
874 if ![string equal "" $exec_output] {
880 set exec_output [binutils_run $prog2 "$flags2 ${copyfile}"]
881 if ![string equal "" $exec_output] {
888 # Tests that in a debug only copy of a file the sections
889 # headers whose types have been changed to NOBITS still
890 # retain their sh_link fields.
892 proc keep_debug_symbols_and_check_links { prog flags test } {
895 remote_file build delete tmpdir/striprog
896 remote_download build tmpdir/copyprog tmpdir/striprog
897 if [is_remote host] {
898 set copyfile [remote_download host tmpdir/striprog]
900 set copyfile tmpdir/striprog
903 set exec_output [binutils_run $prog "$flags ${copyfile}"]
904 if ![string equal "" $exec_output] {
909 set got [binutils_run $READELF "-S --wide ${copyfile}"]
912 # Regexp to match a section with NOBITS type and extract its name and sh_link fields
914 {[^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]+)(.*)} \
915 $got all name link rest]} {
918 # Only some NOBITS sections should have a non-zero sh_link field.
919 # Look for them by name.
920 verbose "NOBITS section .$name has a 0 sh_link field\n"
922 "rela.*" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
923 "rel.*" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
924 "hash" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
925 "gnu_version" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
926 "dynsym" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
927 "gnu.version_r" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
928 "dynamic" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
929 "symtab" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
943 set test1 "simple objcopy of executable"
944 set test1r "run objcopy of executable"
945 set test2 "strip executable"
946 set test2r "run stripped executable"
947 set test3 "strip executable with saving a symbol"
948 set test3r "run stripped executable with saving a symbol"
949 set test4 "keep only debug data"
950 set test5 "simple objcopy of debug data"
952 set test6 "NOBITS sections retain sh_link field"
955 switch [copy_setup] {
973 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" ""
975 strip_executable "$STRIP" "$STRIPFLAGS" "$test2" ""
977 strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test3" ""
979 keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test4" \
980 "$OBJCOPY" "$OBJCOPYFLAGS" "$test5"
982 keep_debug_symbols_and_check_links "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test6"
986 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" "$test1r"
987 strip_executable "$STRIP" "$STRIPFLAGS" "$test2" "$test2r"
988 strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test3" "$test3r"
989 keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test4" \
990 "$OBJCOPY" "$OBJCOPYFLAGS" "$test5"
992 keep_debug_symbols_and_check_links "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test6"
997 proc objcopy_test_readelf {testname srcfile} {
1004 if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
1005 unresolved "objcopy ($testname)"
1009 verbose -log "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"
1010 set exec_output [remote_exec host "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"]
1011 if { [lindex $exec_output 0] != 0
1012 || ![string equal "" [lindex $exec_output 1]] } then {
1013 fail "objcopy ($testname)"
1017 verbose -log "$READELF -a tmpdir/bintest.o > tmpdir/bintest.o.out"
1018 set exec_output [remote_exec host "$READELF -a tmpdir/bintest.o" "" "/dev/null" "tmpdir/bintest.o.out"]
1019 if { [lindex $exec_output 0] != 0 } then {
1020 unresolved "objcopy ($testname)"
1023 set exec_output [prune_warnings [lindex $exec_output 1]]
1024 if ![string equal "" $exec_output] then {
1025 unresolved "objcopy ($testname)"
1029 verbose -log "$READELF -a tmpdir/copy.o > tmpdir/copy.o.out"
1030 set exec_output [remote_exec host "$READELF -a tmpdir/copy.o" "" "/dev/null" "tmpdir/copy.o.out"]
1031 if { [lindex $exec_output 0] != 0 } then {
1032 unresolved "objcopy ($testname)"
1035 set exec_output [prune_warnings [lindex $exec_output 1]]
1036 if ![string equal "" $exec_output] then {
1037 unresolved "objcopy ($testname)"
1041 verbose -log "diff tmpdir/bintest.o.out tmpdir/copy.o.out"
1042 catch "exec diff tmpdir/bintest.o.out tmpdir/copy.o.out" exec_output
1043 set exec_output [prune_warnings $exec_output]
1045 if [string equal "" $exec_output] then {
1046 pass "objcopy ($testname)"
1048 fail "objcopy ($testname)"
1052 proc objcopy_test_symbol_manipulation {} {
1056 set test_list [lsort [glob -nocomplain $srcdir/$subdir/symbols-*.d]]
1057 foreach t $test_list {
1058 # We need to strip the ".d", but can leave the dirname.
1059 verbose [file rootname $t]
1060 run_dump_test [file rootname $t]
1064 proc objcopy_test_elf_common_symbols {} {
1068 # hpux has a non-standard common directive.
1069 if { [istarget "*-*-hpux*"] } then {
1073 set test_list [lsort [glob -nocomplain $srcdir/$subdir/common-*.d]]
1074 foreach t $test_list {
1075 # We need to strip the ".d", but can leave the dirname.
1076 verbose [file rootname $t]
1077 run_dump_test [file rootname $t]
1081 # ia64 specific tests
1082 if { ([istarget "ia64-*-elf*"]
1083 || [istarget "ia64-*-linux*"]) } {
1084 objcopy_test "ia64 link order" link-order.s
1087 # ELF specific tests
1089 if [is_elf_format] {
1090 objcopy_test_symbol_manipulation
1091 objcopy_test_elf_common_symbols
1092 objcopy_test "ELF unknown section type" unknown.s
1093 objcopy_test_readelf "ELF group 1" group.s
1094 objcopy_test_readelf "ELF group 2" group-2.s
1095 objcopy_test_readelf "ELF group 3" group-3.s
1096 objcopy_test_readelf "ELF group 4" group-4.s
1097 objcopy_test_readelf "GNU_MBIND section" mbind1.s
1098 run_dump_test "group-5"
1099 run_dump_test "group-6"
1100 run_dump_test "group-7a"
1101 run_dump_test "group-7b"
1102 run_dump_test "group-7c"
1103 run_dump_test "copy-1"
1104 run_dump_test "note-1"
1105 # Use copytest.o from the note-1 test to determine ELF32 or ELF64
1106 if [is_elf64 tmpdir/copytest.o] {
1107 set elf64 "--defsym ELF64=1"
1108 run_dump_test "note-2-64"
1109 run_dump_test "note-3-64"
1110 run_dump_test "note-4-64"
1112 run_dump_test "note-2-32"
1113 run_dump_test "note-3-32"
1114 run_dump_test "note-4-32"
1116 run_dump_test "note-5"
1119 run_dump_test "copy-2"
1120 run_dump_test "copy-3"
1121 run_dump_test "copy-4"
1122 run_dump_test "copy-5"
1123 run_dump_test "copy-6"
1125 # Use bintest.o from the copy-4 test to determine ELF reloc type
1126 set reloc_format rel
1127 if { [is_elf_format] && [is_rela tmpdir/bintest.o] } {
1128 set reloc_format rela
1130 run_dump_test "pr19020a"
1131 run_dump_test "pr19020b"
1133 if [is_elf_format] {
1134 run_dump_test "strip-1"
1135 run_dump_test "strip-2"
1136 run_dump_test "strip-3"
1137 run_dump_test "strip-4"
1138 run_dump_test "strip-5"
1139 run_dump_test "strip-6"
1140 run_dump_test "strip-7"
1141 run_dump_test "strip-8"
1142 run_dump_test "strip-9"
1143 run_dump_test "strip-12"
1145 if { [istarget "mips64*-*-openbsd*"] } {
1146 set reloc_format mips64
1148 # A relocation type not supported by any target
1149 if { [istarget "nds32*-*"] } {
1154 run_dump_test "strip-13" [list \
1155 [list source strip-13${reloc_format}.s] \
1156 [list as "${elf64} --defsym RELOC=${reloc}"]]
1157 # Select a relocation number that corresponds to one actually
1158 # supported by the target and ABI being tested.
1159 if { [istarget "aarch64*-*"] } {
1161 } elseif { [istarget "ia64*-*"] \
1162 || [istarget "m32r*-*"] \
1163 || [istarget "nds32*-*"] \
1164 || [istarget "v850*-*"] } {
1166 } elseif { [istarget "pru-*"] } {
1171 run_dump_test "strip-14" [list \
1172 [list source strip-14${reloc_format}.s] \
1173 [list as "${elf64} --defsym RELOC=${reloc}"]]
1174 run_dump_test "strip-15" [list \
1175 [list source strip-15${reloc_format}.s] \
1176 [list as "${elf64} --defsym RELOC=${reloc}"]]
1178 # This requires STB_GNU_UNIQUE support with OSABI set to GNU.
1179 if { [supports_gnu_unique] } {
1180 run_dump_test "strip-10"
1182 run_dump_test "strip-11"
1184 if { [istarget "i*86-*"] || [istarget "x86_64-*-*"] } {
1185 # Check to make sure we don't strip a symbol named in relocations.
1186 set test "objcopy keeps symbols needed by relocs"
1188 set srcfile $srcdir/$subdir/needed-by-reloc.s
1190 if {![binutils_assemble $srcfile tmpdir/bintest.o]} then {
1193 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-symbol=foo tmpdir/bintest.o ${copyfile}.o"]
1195 if [regexp "not stripping symbol `foo' because it is named in a relocation" $got] {
1203 # The symbol table for some MIPS targets is sorted differently than
1204 # the ELF canonical order, so the regexps in localize-hidden-1.d fail
1206 if { [is_bad_symtab] } then {
1209 run_dump_test "localize-hidden-1"
1210 run_dump_test "testranges"
1211 run_dump_test "testranges-ia64"
1213 run_dump_test "add-section"
1214 run_dump_test "add-symbol"
1215 run_dump_test "add-empty-section"
1217 run_dump_test "exclude-1a"
1218 run_dump_test "exclude-1b"
1220 run_dump_test "only-section-01"
1221 run_dump_test "remove-section-01"
1223 # Test the remove relocation functionality
1224 set test_list [lsort [glob -nocomplain $srcdir/$subdir/remove-relocs-*.d]]
1225 foreach t $test_list {
1226 # We need to strip the ".d", but can leave the dirname.
1227 verbose [file rootname $t]
1228 run_dump_test [file rootname $t]
1231 run_dump_test "localize-hidden-2"
1233 # Test objcopying an object file without global symbol
1235 proc objcopy_test_without_global_symbol { } {
1243 set test "strip without global symbol "
1245 if { [target_compile $srcdir/$subdir/pr19547.c tmpdir/pr19547.o object debug] != "" } {
1250 if [is_remote host] {
1251 set objfile [remote_download host tmpdir/pr19547.o]
1253 set objfile tmpdir/pr19547.o
1256 set exec_output [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-unneeded $objfile"]
1257 set exec_output [prune_warnings $exec_output]
1258 if ![string equal "" $exec_output] {
1263 set exec_output [binutils_run $OBJDUMP "$OBJDUMPFLAGS -t $objfile"]
1264 set exec_output [prune_warnings $exec_output]
1265 if {![regexp "no symbols" $exec_output]} {
1273 # The AArch64 and ARM targets preserve mapping symbols
1274 # in object files, so they will fail this test.
1275 setup_xfail aarch64*-*-* arm*-*-*
1277 objcopy_test_without_global_symbol
1279 # objcopy remove relocation from executable test
1281 proc objcopy_remove_relocations_from_executable { } {
1287 set test "remove-section relocation sections"
1289 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/pr23611 executable debug] != "" } {
1294 if [is_remote host] {
1295 set objfile [remote_download host tmpdir/pr23611]
1297 set objfile tmpdir/pr23611
1299 set out tmpdir/pr23611.out
1301 set exec_output1 [binutils_run $OBJCOPY "-R .rela.plt -R .rela.dyn -R .rel.plt -R .rel.dyn $objfile $out"]
1302 set exec_output2 [binutils_run $READELF "-S $out"]
1303 if { [string match "*.rel.plt*" $exec_output2] || [string match "*.rela.plt*" $exec_output2] || [string match "*.rel.dyn*" $exec_output2] || [string match "*.rela.dyn*" $exec_output2] } {
1310 objcopy_remove_relocations_from_executable
1312 run_dump_test "pr23633"