1 # Copyright (C) 1994-2018 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 if { [file exists $tempfile] } {
106 # Test reversing bytes in a section.
108 set reversed ${tempfile}-reversed
109 set sect_names [get_standard_section_names]
110 if { $sect_names != "" } {
111 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j [lindex $sect_names 1] --reverse-bytes=4 $tempfile $reversed"]
113 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j .data --reverse-bytes=4 $tempfile $reversed"]
116 if ![string equal "" $got] then {
117 fail "objcopy --reverse-bytes"
119 if [is_remote host] {
120 remote_upload host ${reversed} tmpdir/copy-reversed.o
121 set reversed tmpdir/copy-reversed.o
124 set origdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $tempfile"]
125 set revdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $reversed"]
127 set want "^ \[0-9\]+ (\[0-9\]+)"
128 set found_orig [regexp -lineanchor $want $origdata -> origdata]
129 set found_rev [regexp -lineanchor $want $revdata -> revdata]
131 if {$found_orig == 0 || $found_rev == 0} then {
132 # som doesn't have a .data section
133 setup_xfail "hppa*-*-hpux*"
134 clear_xfail "hppa*64*-*-hpux*"
136 fail "objcopy --reverse-bytes"
138 scan $origdata "%2x%2x%2x%2x" b1 b2 b3 b4
139 scan $revdata "%2x%2x%2x%2x" c4 c3 c2 c1
141 if {$b1 == $c1 && $b2 == $c2 && $b3 == $c3 && $b4 == $c4} then {
142 pass "objcopy --reverse-bytes"
144 fail "objcopy --reverse-bytes"
150 # Test interleaved copy of multiple byte width
152 set sequence_file sequence_file
153 set file [open ${sequence_file} w]
154 puts ${file} "12345678"
157 if [is_remote host] {
158 remote_upload host ${sequence_file} tmpdir/sequence_file
159 set sequence_file tmpdir/sequence_file
162 set got [binutils_run $OBJCOPY "-I binary -i 4 -b 0 --interleave-width 2 ${sequence_file} ${copyfile}"]
164 if ![string equal "" $got] then {
165 fail "objcopy -i --interleave-width"
167 if [is_remote host] {
168 remote_upload host ${copyfile} tmpdir/interleave_output
169 set interleave_output tmpdir/interleave_output
171 set interleave_output ${copyfile}
174 set file [open ${interleave_output} r]
179 if ![string equal "1256" $line] then {
180 fail "objcopy -i --interleave-width"
182 pass "objcopy -i --interleave-width"
187 # Test generating S records.
189 if { [file exists $tempfile] } {
190 # We make the srec filename 8.3 compatible. Note that the header string
191 # matched against depends on the name of the file. Ugh.
193 if [is_remote host] {
194 set srecfile copy.sre
195 set header_string S00B0000636F70792E737265C1
197 set srecfile ${copyfile}.srec
198 set header_string S0130000746D706469722F636F70792E7372656397
201 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"]
203 if ![string equal "" $got] then {
204 fail "objcopy -O srec"
206 if [is_remote host] {
207 remote_upload host ${srecfile} tmpdir/copy.srec
208 set srecfile tmpdir/copy.srec
210 set file [open ${srecfile} r]
212 # The first S record is fixed by the file name we are using.
216 if ![regexp "$header_string.*" $line] {
217 send_log "bad header\n"
218 fail "objcopy -O srec"
220 while {[gets $file line] != -1 \
221 && [regexp "^S\[123\]\[0-9a-fA-F\]+\[\r\n\]*$" $line]} {
228 if ![regexp "^S\[789\]\[0-9a-fA-F\]+\[\r\n\]*$" $line] then {
229 send_log "bad trailer\n"
230 fail "objcopy -O srec"
232 if {[gets $file line] != -1} then {
233 send_log "garbage at end\n"
236 fail "objcopy -O srec"
238 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${srecfile}"]
239 if ![regexp "file format srec" $got] then {
240 send_log "objdump failed\n"
241 fail "objcopy -O srec"
243 pass "objcopy -O srec"
253 # Test setting and adjusting the start address. We only test this
254 # while generating S records, because we may not be able to set the
255 # start address for other object file formats, and the S record case
256 # is the only useful one anyhow.
258 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $tempfile"]
259 if ![regexp "start address (\[0-9a-fA-FxX\]+)" $got all origstart] then {
260 perror "objdump can not recognize bintest.o"
263 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --set-start 0x7654 $tempfile ${copyfile}.srec"]
264 if ![string equal "" $got] then {
265 fail "objcopy --set-start"
267 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
268 if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
269 fail "objcopy --set-start"
271 if {$srecstart != 0x7654} then {
272 send_log "$srecstart != 0x7654\n"
273 fail "objcopy --set-start"
275 pass "objcopy --set-start"
280 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-start 0x123 $tempfile ${copyfile}.srec"]
281 if ![string equal "" $got] then {
282 fail "objcopy --adjust-start"
284 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
285 if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
286 fail "objcopy --adjust-start"
288 if {$srecstart != $origstart + 0x123} then {
289 send_log "$srecstart != $origstart + 0x123\n"
290 fail "objcopy --adjust-start"
292 pass "objcopy --adjust-start"
298 # Test adjusting the overall VMA, and adjusting the VMA of a
299 # particular section. We again only test this when generating S
305 set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"]
307 set headers_regexp "\[ 0-9\]+(\[^ \]+)\[ \]*(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)\[ \]+\[0-9a-fA-F\]+\[ \]+2\[*\]\[*\]\[0-9\]+(.*)"
310 while {[regexp $headers_regexp $got all name size vma rest]} {
314 if {$low == "" || $vma < $low} {
322 if {$low == "" || $origstart == ""} then {
323 perror "objdump can not recognize bintest.o"
325 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-vma 0x123 $tempfile ${copyfile}.srec"]
326 if ![string equal "" $got] then {
327 fail "objcopy --adjust-vma"
329 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -fh ${copyfile}.srec"]
330 set want "file format srec.*start address\[ \]*(\[0-9a-fA-FxX\]+).*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
331 if ![regexp $want $got all start vma] then {
332 fail "objcopy --adjust-vma"
335 if {$vma != $low + 0x123} then {
336 send_log "$vma != $low + 0x123\n"
337 fail "objcopy --adjust-vma"
339 if {$start != $origstart + 0x123} then {
340 send_log "$start != $origstart + 0x123\n"
341 fail "objcopy --adjust-vma"
343 pass "objcopy --adjust-vma"
351 while {[regexp $headers_regexp $got all name size vma rest]} {
353 if {$vma == $low} then {
354 set arg "$arg --adjust-section-vma $name+4"
359 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $arg $tempfile ${copyfile}.srec"]
360 if ![string equal "" $got] then {
361 fail "objcopy --adjust-section-vma +"
363 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
364 set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
365 if ![regexp $want $got all vma] then {
366 fail "objcopy --adjust-section-vma +"
369 if {$vma != $low + 4} then {
370 send_log "$vma != $low + 4\n"
371 fail "objcopy --adjust-section-vma +"
373 pass "objcopy --adjust-section-vma +"
378 regsub -all "\\+4" $arg "=[expr $low + 4]" argeq
379 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $argeq $tempfile ${copyfile}.srec"]
380 if ![string equal "" $got] then {
381 fail "objcopy --adjust-section-vma ="
383 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
384 set want "file format srec.*sec1\[ \]+\[0-9a-fA-F\]+\[ \]+(\[0-9a-fA-F\]+)"
385 if ![regexp $want $got all vma] then {
386 fail "objcopy --adjust-section-vma ="
389 if {$vma != $low + 4} then {
390 send_log "$vma != $low + 4\n"
391 fail "objcopy --adjust-section-vma ="
393 pass "objcopy --adjust-section-vma ="
399 # Test stripping an object.
401 proc strip_test { } {
414 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
419 set osabi_fail "false"
421 verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.in"
422 set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.in"]
423 if { [lindex $exec_output 0] != 0 } then {
424 unresolved "$test preserving OS/ABI"
425 set osabi_fail "true"
427 verbose -log "grep OS/ABI tmpdir/osabi.in"
428 catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
432 if [is_remote host] {
433 set archive libstrip.a
434 set objfile [remote_download host tmpdir/testprog.o]
435 remote_file host delete $archive
437 set archive tmpdir/libstrip.a
438 set objfile tmpdir/testprog.o
441 remote_file build delete tmpdir/libstrip.a
443 set exec_output [binutils_run $AR "rc $archive ${objfile}"]
444 set exec_output [prune_warnings $exec_output]
445 if ![string equal "" $exec_output] {
447 unresolved "$test preserving OS/ABI"
451 set exec_output [binutils_run $STRIP "-g $archive"]
452 set exec_output [prune_warnings $exec_output]
453 if ![string equal "" $exec_output] {
455 unresolved "$test preserving OS/ABI"
459 set exec_output [binutils_run $STRIP "$STRIPFLAGS $archive"]
460 set exec_output [prune_warnings $exec_output]
461 if ![string equal "" $exec_output] {
463 unresolved "$test preserving OS/ABI"
467 if { $osabi_fail != "true" && [is_elf_format] } {
468 verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.out"
469 set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.out"]
470 if { [lindex $exec_output 0] != 0 } then {
471 unresolved "$test preserving OS/ABI"
473 verbose -log "grep OS/ABI tmpdir/osabi.out"
474 catch "exec grep OS/ABI tmpdir/osabi.out" osabi_out
475 if { "$osabi_in" == "$osabi_out" } {
476 pass "$test preserving OS/ABI"
478 fail "$test preserving OS/ABI"
483 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
488 if [is_remote host] {
489 set objfile [remote_download host tmpdir/testprog.o]
491 set objfile tmpdir/testprog.o
494 set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"]
495 set exec_output [prune_warnings $exec_output]
496 if ![string equal "" $exec_output] {
501 set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"]
502 set exec_output [prune_warnings $exec_output]
503 if ![string match "*: no symbols*" $exec_output] {
513 # Test stripping an object file with saving a symbol
515 proc strip_test_with_saving_a_symbol { } {
524 set test "strip with saving a symbol"
526 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
531 if [is_remote host] {
532 set objfile [remote_download host tmpdir/testprog.o]
534 set objfile tmpdir/testprog.o
537 set exec_output [binutils_run $STRIP "$STRIPFLAGS -K main -K _main $objfile"]
538 set exec_output [prune_warnings $exec_output]
539 if ![string equal "" $exec_output] {
544 set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
545 set exec_output [prune_warnings $exec_output]
546 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
547 && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} {
555 strip_test_with_saving_a_symbol
557 # Build a final executable.
559 if { [istarget *-*-cygwin] || [istarget *-*-mingw*] } {
560 set test_prog "testprog.exe"
562 set test_prog "testprog"
565 proc copy_setup { } {
572 set res [build_wrapper testglue.o]
575 if { [istarget *-*-uclinux*] && ![istarget tic6x-*-*] && ![istarget arm*-*-uclinuxfdpiceabi] } {
580 lappend flags "additional_flags=[lindex $res 1]"
581 set add_libs "testglue.o"
586 if { [istarget *-*-linux*]
587 || [istarget *-*-gnu*] } {
588 foreach i $gcc_gas_flag {
589 set flags "additional_flags=$i $flags"
592 if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/$test_prog executable $flags] != "" } {
596 set result [remote_load target tmpdir/$test_prog]
597 set status [lindex $result 0]
599 if { $status != "pass" } {
600 send_log "cannot run executable, status = ${status} on ${host_triplet}\n"
607 # Test copying an executable.
609 proc copy_executable { prog flags test1 test2 } {
612 if [is_remote host] {
613 set testfile [remote_download host tmpdir/$test_prog]
614 set testcopy copyprog
616 set testfile tmpdir/$test_prog
617 set testcopy tmpdir/copyprog
619 remote_file host delete $testcopy
621 set exec_output [binutils_run $prog "$flags $testfile $testcopy"]
623 if ![string equal "" $exec_output] {
625 if [string equal "" $test2] {
632 if [is_remote host] {
633 remote_upload host $testcopy tmpdir/copyprog
636 set status [remote_exec build "cmp" "tmpdir/$test_prog tmpdir/copyprog"]
637 set exec_output [lindex $status 1]
639 if [string equal "" $exec_output] then {
642 send_log "$exec_output\n"
643 verbose "$exec_output"
645 # This will fail for many reasons. For example, it will most
646 # likely fail if a non-GNU linker is used. Therefore, we do
647 # not insist that it pass. If you are using an assembler and
648 # linker based on the same BFD as objcopy, it is worth
649 # investigating to see why this failure occurs. If we are
650 # cross compiling, we assume that a GNU linker is being used,
651 # and expect it to succeed.
652 if {[isnative]} then {
656 # This also fails for some mips targets. See elf32-mips.c
657 # mips_elf_sym_is_global.
658 if { [is_bad_symtab] } then {
662 setup_xfail "arm*-*-pe"
663 setup_xfail "*-*-mingw*"
664 setup_xfail "*-*-cygwin*"
669 if [string equal "" $test2] {
673 set output [remote_load target tmpdir/copyprog]
674 set status [lindex $output 0]
675 if { $status != "pass" } {
682 # Test stripping an executable
684 proc strip_executable { prog flags test1 test2 } {
689 remote_file build delete tmpdir/striprog
690 remote_download build tmpdir/copyprog tmpdir/striprog
691 if [is_remote host] {
692 set copyfile [remote_download host tmpdir/striprog]
694 set copyfile tmpdir/striprog
697 set osabi_fail "false"
699 verbose -log "$READELF -a ${copyfile} > tmpdir/osabi.in"
700 set exec_output [remote_exec host "$READELF -h ${copyfile}" "" "/dev/null" "tmpdir/osabi.in"]
701 if { [lindex $exec_output 0] != 0 } then {
702 unresolved "$test1 preserving OS/ABI"
703 set osabi_fail "true"
705 verbose -log "grep OS/ABI tmpdir/osabi.in"
706 catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
710 set exec_output [binutils_run $prog "$flags ${copyfile}"]
711 if ![string equal "" $exec_output] {
713 if [string equal "" $test2] {
720 if [is_remote host] {
721 remote_upload host ${copyfile} tmpdir/striprog
724 if { $osabi_fail != "true" && [is_elf_format] } {
725 verbose -log "$READELF -a ${copyfile} > tmpdir/osabi.out"
726 set exec_output [remote_exec host "$READELF -h ${copyfile}" "" "/dev/null" "tmpdir/osabi.out"]
727 if { [lindex $exec_output 0] != 0 } then {
728 unresolved "$test1 preserving OS/ABI"
730 verbose -log "grep OS/ABI tmpdir/osabi.out"
731 catch "exec grep OS/ABI tmpdir/osabi.out" osabi_out
732 if { "$osabi_in" == "$osabi_out" } {
733 pass "$test1 preserving OS/ABI"
735 fail "$test1 preserving OS/ABI"
740 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
741 if ![string match "*: no symbols*" $exec_output] {
746 if [string equal "" $test2] {
750 set result [remote_load target tmpdir/striprog]
751 set status [lindex $result 0]
752 if { $status != "pass" } {
760 # Test stripping an executable with saving a symbol
762 proc strip_executable_with_saving_a_symbol { prog flags test1 test2 } {
766 remote_file build delete tmpdir/striprog
767 remote_download build tmpdir/copyprog tmpdir/striprog
768 if [is_remote host] {
769 set copyfile [remote_download host tmpdir/striprog]
771 set copyfile tmpdir/striprog
774 set exec_output [binutils_run $prog "$flags ${copyfile}"]
775 if ![string equal "" $exec_output] {
777 if [string equal "" $test2] {
784 set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
785 if { [istarget mmix-knuth-mmixware] } {
786 # Whenever there's a symbol in the mmo format, there's the symbol
787 # Main, so remove it manually from the expected output for sake of
790 # Using "" not {} to get the \n and \r translated.
791 regsub "^\[0-9a-fA-F\]+\[ \]+T Main\[\n\r\]+" $exec_output "" exec_output
794 if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
795 && ![regexp {^([0-9a-fA-F]+)?[ ]+[TD] _main} $exec_output]} {
800 if [string equal "" $test2] {
804 if [is_remote host] {
805 remote_upload host ${copyfile} tmpdir/striprog
808 set result [remote_load target tmpdir/striprog]
809 set status [lindex $result 0]
810 if { $status != "pass" } {
818 # Test keeping only debug symbols of an executable
820 proc keep_debug_symbols_and_test_copy { prog1 flags1 test1 prog2 flags2 test2 } {
821 remote_file build delete tmpdir/striprog
822 remote_download build tmpdir/copyprog tmpdir/striprog
823 if [is_remote host] {
824 set copyfile [remote_download host tmpdir/striprog]
826 set copyfile tmpdir/striprog
829 set exec_output [binutils_run $prog1 "$flags1 ${copyfile}"]
830 if ![string equal "" $exec_output] {
836 set exec_output [binutils_run $prog2 "$flags2 ${copyfile}"]
837 if ![string equal "" $exec_output] {
844 # Tests that in a debug only copy of a file the sections
845 # headers whose types have been changed to NOBITS still
846 # retain their sh_link fields.
848 proc keep_debug_symbols_and_check_links { prog flags test } {
851 remote_file build delete tmpdir/striprog
852 remote_download build tmpdir/copyprog tmpdir/striprog
853 if [is_remote host] {
854 set copyfile [remote_download host tmpdir/striprog]
856 set copyfile tmpdir/striprog
859 set exec_output [binutils_run $prog "$flags ${copyfile}"]
860 if ![string equal "" $exec_output] {
865 set got [binutils_run $READELF "-S --wide ${copyfile}"]
868 # Regexp to match a section with NOBITS type and extract its name and sh_link fields
870 {[^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]+)(.*)} \
871 $got all name link rest]} {
874 # Only some NOBITS sections should have a non-zero sh_link field.
875 # Look for them by name.
876 verbose "NOBITS section .$name has a 0 sh_link field\n"
878 "rela.*" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
879 "rel.*" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
880 "hash" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
881 "gnu_version" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
882 "dynsym" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
883 "gnu.version_r" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
884 "dynamic" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
885 "symtab" { set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
899 set test1 "simple objcopy of executable"
900 set test1r "run objcopy of executable"
901 set test2 "strip executable"
902 set test2r "run stripped executable"
903 set test3 "strip executable with saving a symbol"
904 set test3r "run stripped executable with saving a symbol"
905 set test4 "keep only debug data"
906 set test5 "simple objcopy of debug data"
908 set test6 "NOBITS sections retain sh_link field"
911 switch [copy_setup] {
929 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" ""
931 strip_executable "$STRIP" "$STRIPFLAGS" "$test2" ""
933 strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test3" ""
935 keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test4" \
936 "$OBJCOPY" "$OBJCOPYFLAGS" "$test5"
938 keep_debug_symbols_and_check_links "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test6"
942 copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" "$test1r"
943 strip_executable "$STRIP" "$STRIPFLAGS" "$test2" "$test2r"
944 strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test3" "$test3r"
945 keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test4" \
946 "$OBJCOPY" "$OBJCOPYFLAGS" "$test5"
948 keep_debug_symbols_and_check_links "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test6"
953 proc objcopy_test_readelf {testname srcfile} {
960 if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
961 unresolved "objcopy ($testname)"
965 verbose -log "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"
966 set exec_output [remote_exec host "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"]
967 if { [lindex $exec_output 0] != 0
968 || ![string equal "" [lindex $exec_output 1]] } then {
969 fail "objcopy ($testname)"
973 verbose -log "$READELF -a tmpdir/bintest.o > tmpdir/bintest.o.out"
974 set exec_output [remote_exec host "$READELF -a tmpdir/bintest.o" "" "/dev/null" "tmpdir/bintest.o.out"]
975 if { [lindex $exec_output 0] != 0 } then {
976 unresolved "objcopy ($testname)"
979 set exec_output [prune_warnings [lindex $exec_output 1]]
980 if ![string equal "" $exec_output] then {
981 unresolved "objcopy ($testname)"
985 verbose -log "$READELF -a tmpdir/copy.o > tmpdir/copy.o.out"
986 set exec_output [remote_exec host "$READELF -a tmpdir/copy.o" "" "/dev/null" "tmpdir/copy.o.out"]
987 if { [lindex $exec_output 0] != 0 } then {
988 unresolved "objcopy ($testname)"
991 set exec_output [prune_warnings [lindex $exec_output 1]]
992 if ![string equal "" $exec_output] then {
993 unresolved "objcopy ($testname)"
997 verbose -log "diff tmpdir/bintest.o.out tmpdir/copy.o.out"
998 catch "exec diff tmpdir/bintest.o.out tmpdir/copy.o.out" exec_output
999 set exec_output [prune_warnings $exec_output]
1001 if [string equal "" $exec_output] then {
1002 pass "objcopy ($testname)"
1004 fail "objcopy ($testname)"
1008 proc objcopy_test_symbol_manipulation {} {
1012 set test_list [lsort [glob -nocomplain $srcdir/$subdir/symbols-*.d]]
1013 foreach t $test_list {
1014 # We need to strip the ".d", but can leave the dirname.
1015 verbose [file rootname $t]
1016 run_dump_test [file rootname $t]
1020 proc objcopy_test_elf_common_symbols {} {
1024 # hpux has a non-standard common directive.
1025 if { [istarget "*-*-hpux*"] } then {
1029 set test_list [lsort [glob -nocomplain $srcdir/$subdir/common-*.d]]
1030 foreach t $test_list {
1031 # We need to strip the ".d", but can leave the dirname.
1032 verbose [file rootname $t]
1033 run_dump_test [file rootname $t]
1037 # ia64 specific tests
1038 if { ([istarget "ia64-*-elf*"]
1039 || [istarget "ia64-*-linux*"]) } {
1040 objcopy_test "ia64 link order" link-order.s
1043 # ELF specific tests
1045 if [is_elf_format] {
1046 objcopy_test_symbol_manipulation
1047 objcopy_test_elf_common_symbols
1048 objcopy_test "ELF unknown section type" unknown.s
1049 objcopy_test_readelf "ELF group 1" group.s
1050 objcopy_test_readelf "ELF group 2" group-2.s
1051 objcopy_test_readelf "ELF group 3" group-3.s
1052 objcopy_test_readelf "ELF group 4" group-4.s
1053 objcopy_test_readelf "GNU_MBIND section" mbind1.s
1054 run_dump_test "group-5"
1055 run_dump_test "group-6"
1056 run_dump_test "group-7a"
1057 run_dump_test "group-7b"
1058 run_dump_test "group-7c"
1059 run_dump_test "copy-1"
1060 run_dump_test "note-1"
1061 # Use bintest.o from the note-1 test to determine ELF32 or ELF64
1062 if [is_elf64 tmpdir/bintest.o] {
1063 set elf64 "--defsym ELF64=1"
1064 run_dump_test "note-2-64"
1065 run_dump_test "note-3-64"
1066 run_dump_test "note-4-64"
1068 run_dump_test "note-2-32"
1069 run_dump_test "note-3-32"
1070 run_dump_test "note-4-32"
1072 run_dump_test "note-5"
1075 run_dump_test "copy-2"
1076 run_dump_test "copy-3"
1077 run_dump_test "copy-4"
1078 run_dump_test "copy-5"
1080 # Use bintest.o from the copy-4 test to determine ELF reloc type
1081 set reloc_format rel
1082 if { [is_elf_format] && [is_rela tmpdir/bintest.o] } {
1083 set reloc_format rela
1085 run_dump_test "pr19020a"
1086 run_dump_test "pr19020b"
1088 if [is_elf_format] {
1089 run_dump_test "strip-1"
1090 run_dump_test "strip-2"
1091 run_dump_test "strip-3"
1092 run_dump_test "strip-4"
1093 run_dump_test "strip-5"
1094 run_dump_test "strip-6"
1095 run_dump_test "strip-7"
1096 run_dump_test "strip-8"
1097 run_dump_test "strip-9"
1098 run_dump_test "strip-12"
1100 if { [istarget "mips64*-*-openbsd*"] } {
1101 set reloc_format mips64
1103 # A relocation type not supported by any target
1104 if { [istarget "nds32*-*"] } {
1109 run_dump_test "strip-13" [list \
1110 [list source strip-13${reloc_format}.s] \
1111 [list as "${elf64} --defsym RELOC=${reloc}"]]
1112 # Select a relocation number that corresponds to one actually
1113 # supported by the target and ABI being tested.
1114 if { [istarget "aarch64*-*"] } {
1116 } elseif { [istarget "ia64*-*"] \
1117 || [istarget "m32r*-*"] \
1118 || [istarget "nds32*-*"] \
1119 || [istarget "v850*-*"] } {
1121 } elseif { [istarget "pru-*"] } {
1126 run_dump_test "strip-14" [list \
1127 [list source strip-14${reloc_format}.s] \
1128 [list as "${elf64} --defsym RELOC=${reloc}"]]
1129 run_dump_test "strip-15" [list \
1130 [list source strip-15${reloc_format}.s] \
1131 [list as "${elf64} --defsym RELOC=${reloc}"]]
1133 # This requires STB_GNU_UNIQUE support with OSABI set to GNU.
1134 if { [supports_gnu_unique] } {
1135 run_dump_test "strip-10"
1137 run_dump_test "strip-11"
1139 if { [istarget "i*86-*"] || [istarget "x86_64-*-*"] } {
1140 # Check to make sure we don't strip a symbol named in relocations.
1141 set test "objcopy keeps symbols needed by relocs"
1143 set srcfile $srcdir/$subdir/needed-by-reloc.s
1145 if {![binutils_assemble $srcfile tmpdir/bintest.o]} then {
1148 set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-symbol=foo tmpdir/bintest.o ${copyfile}.o"]
1150 if [regexp "not stripping symbol `foo' because it is named in a relocation" $got] {
1158 # The symbol table for some MIPS targets is sorted differently than
1159 # the ELF canonical order, so the regexps in localize-hidden-1.d fail
1161 if { [is_bad_symtab] } then {
1164 run_dump_test "localize-hidden-1"
1165 run_dump_test "testranges"
1166 run_dump_test "testranges-ia64"
1168 run_dump_test "add-section"
1169 run_dump_test "add-symbol"
1170 run_dump_test "add-empty-section"
1172 run_dump_test "exclude-1a"
1173 run_dump_test "exclude-1b"
1175 run_dump_test "only-section-01"
1176 run_dump_test "remove-section-01"
1178 # Test the remove relocation functionality
1179 set test_list [lsort [glob -nocomplain $srcdir/$subdir/remove-relocs-*.d]]
1180 foreach t $test_list {
1181 # We need to strip the ".d", but can leave the dirname.
1182 verbose [file rootname $t]
1183 run_dump_test [file rootname $t]
1186 run_dump_test "localize-hidden-2"
1188 # Test objcopying an object file without global symbol
1190 proc objcopy_test_without_global_symbol { } {
1198 set test "strip without global symbol "
1200 if { [target_compile $srcdir/$subdir/pr19547.c tmpdir/pr19547.o object debug] != "" } {
1205 if [is_remote host] {
1206 set objfile [remote_download host tmpdir/pr19547.o]
1208 set objfile tmpdir/pr19547.o
1211 set exec_output [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-unneeded $objfile"]
1212 set exec_output [prune_warnings $exec_output]
1213 if ![string equal "" $exec_output] {
1218 set exec_output [binutils_run $OBJDUMP "$OBJDUMPFLAGS -t $objfile"]
1219 set exec_output [prune_warnings $exec_output]
1220 if {![regexp "no symbols" $exec_output]} {
1228 # The AArch64 and ARM targets preserve mapping symbols
1229 # in object files, so they will fail this test.
1230 setup_xfail aarch64*-*-* arm*-*-*
1232 objcopy_test_without_global_symbol
1234 # objcopy remove relocation from executable test
1236 proc objcopy_remove_relocations_from_executable { } {
1242 set test "remove-section relocation sections"
1244 if { [target_compile $srcdir/$subdir/testprog.c tmpdir/pr23611 executable debug] != "" } {
1249 if [is_remote host] {
1250 set objfile [remote_download host tmpdir/pr23611]
1252 set objfile tmpdir/pr23611
1254 set out tmpdir/pr23611.out
1256 set exec_output1 [binutils_run $OBJCOPY "-R .rela.plt -R .rela.dyn -R .rel.plt -R .rel.dyn $objfile $out"]
1257 set exec_output2 [binutils_run $READELF "-S $out"]
1258 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] } {
1265 objcopy_remove_relocations_from_executable
1267 run_dump_test "pr23633"