Home | History | Annotate | Download | only in binutils-all
      1 #   Copyright (C) 1994-2016 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 (at) prep.ai.mit.edu
     19 
     20 # Written by Ian Lance Taylor <ian (at) cygnus.com>
     21 
     22 if ![is_remote host] {
     23     if {[which $OBJCOPY] == 0} then {
     24         perror "$OBJCOPY does not exist"
     25         return
     26     }
     27 }
     28 
     29 send_user "Version [binutil_version $OBJCOPY]"
     30 
     31 if ![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 
     41 proc 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} $tempfile]} then {
     50  	perror "unresolved $testname"
     51 	unresolved "objcopy ($testname)"
     52 	remote_file host delete $tempfile
     53 	return
     54     }
     55 
     56     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $tempfile ${copyfile}.o"]
     57 
     58     if ![string equal "" $got] then {
     59 	fail "objcopy ($testname)"
     60     } else {
     61 	send_log "cmp $tempfile ${copyfile}.o\n"
     62 	verbose "cmp $tempfile ${copyfile}.o"
     63 	if [is_remote host] {
     64 	    set src1 tmpdir/bintest.o
     65 	    set src2 tmpdir/copy.o
     66 	    remote_upload host $tempfile $src1
     67 	    remote_upload host ${copyfile}.o $src2
     68 	} else {
     69 	    set src1 ${tempfile}
     70 	    set src2 ${copyfile}.o
     71 	}
     72 	set status [remote_exec build cmp "${src1} ${src2}"]
     73 	set exec_output [lindex $status 1]
     74 	set exec_output [prune_warnings $exec_output]
     75 
     76 	# On some systems the result of objcopy will not be identical.
     77 	# Usually this is just because gas isn't using bfd to write the
     78 	# files in the first place, and may order things a little
     79 	# differently. Those systems should use setup_xfail here.
     80 
     81 	setup_xfail "h8300-*-coff"
     82 	setup_xfail "h8500-*-rtems*" "h8500-*-coff"
     83 	setup_xfail "hppa*-*-*"
     84 	setup_xfail "i960-*"
     85 	setup_xfail "m68*-*-*coff" "m68*-*-hpux*" "m68*-*-lynxos*"
     86 	setup_xfail "m68*-*-sysv*" "m68*-apple-aux*"
     87 	setup_xfail "m8*-*"
     88 	setup_xfail "sh-*-coff*"
     89 	setup_xfail "tic80-*-*" "w65-*"
     90 
     91 	clear_xfail "hppa*64*-*-hpux*" "hppa*-*-linux*" "hppa*-*-lites*"
     92 	clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-rtems*" "*-*-*elf*"
     93 	clear_xfail "m68*-*-sysv4*"
     94 
     95 	if [string equal "" $exec_output] then {
     96 	    pass "objcopy ($testname)"
     97 	} else {
     98 	    send_log "$exec_output\n"
     99 	    verbose "$exec_output" 1
    100 
    101 	    # On OSF/1, this succeeds with gas and fails with /bin/as.
    102 	    setup_xfail "alpha*-*-osf*"
    103 
    104 	    fail "objcopy ($testname)"
    105 	}
    106     }
    107 }
    108 
    109 objcopy_test "simple copy" bintest.s
    110 
    111 if { [file exists $tempfile] } {
    112     # Test reversing bytes in a section.
    113 
    114     set reversed ${tempfile}-reversed
    115     set sect_names [get_standard_section_names]
    116     if { $sect_names != "" } {
    117 	set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j [lindex $sect_names 1] --reverse-bytes=4 $tempfile $reversed"]
    118     } else {
    119 	set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j .data --reverse-bytes=4 $tempfile $reversed"]
    120     }
    121 
    122     if ![string equal "" $got] then {
    123 	fail "objcopy --reverse-bytes"
    124     } else {
    125 	if [is_remote host] {
    126 	    remote_upload host ${reversed} tmpdir/copy-reversed.o
    127 	    set reversed tmpdir/copy-reversed.o
    128 	}
    129 
    130 	set origdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $tempfile"]
    131 	set  revdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $reversed"]
    132 
    133 	set want "^ \[0-9\]+ (\[0-9\]+)"
    134 	set found_orig [regexp -lineanchor $want $origdata -> origdata]
    135 	set found_rev [regexp -lineanchor $want $revdata -> revdata]
    136 
    137 	if {$found_orig == 0 || $found_rev == 0} then {
    138 	    # som doesn't have a .data section
    139 	    setup_xfail "hppa*-*-hpux*"
    140 	    clear_xfail "hppa*64*-*-hpux*"
    141 
    142 	    fail "objcopy --reverse-bytes"
    143 	} else {
    144 	    scan $origdata "%2x%2x%2x%2x" b1 b2 b3 b4
    145 	    scan $revdata "%2x%2x%2x%2x" c4 c3 c2 c1
    146 
    147 	    if {$b1 == $c1 && $b2 == $c2 && $b3 == $c3 && $b4 == $c4} then {
    148 		pass "objcopy --reverse-bytes"
    149 	    } else {
    150 		fail "objcopy --reverse-bytes"
    151 	    }
    152 	}
    153     }
    154 }
    155 
    156 # Test interleaved copy of multiple byte width
    157 
    158 set sequence_file sequence_file
    159 set file [open ${sequence_file} w]
    160 puts ${file} "12345678"
    161 close ${file}
    162 
    163 if [is_remote host] {
    164     remote_upload host ${sequence_file} tmpdir/sequence_file
    165     set sequence_file tmpdir/sequence_file
    166 }
    167 
    168 set got [binutils_run $OBJCOPY "-I binary -i 4 -b 0 --interleave-width 2 ${sequence_file} ${copyfile}"]
    169 
    170 if ![string equal "" $got] then {
    171     fail "objcopy -i --interleave-width"
    172 } else {
    173     if [is_remote host] {
    174 	remote_upload host ${copyfile} tmpdir/interleave_output
    175 	set interleave_output tmpdir/interleave_output
    176     } else {
    177 	set interleave_output ${copyfile}
    178     }
    179 
    180     set file [open ${interleave_output} r]
    181     gets $file line
    182     send_log "$line\n"
    183     verbose $line
    184 
    185     if ![string equal "1256" $line] then {
    186 	fail "objcopy -i --interleave-width"
    187     }
    188     pass "objcopy -i --interleave-width"
    189 
    190     close $file
    191 }
    192 
    193 # Test generating S records.
    194 
    195 if { [file exists $tempfile] } {
    196     # We make the srec filename 8.3 compatible. Note that the header string
    197     # matched against depends on the name of the file. Ugh.
    198 
    199     if [is_remote host] {
    200 	set srecfile copy.sre
    201 	set header_string S00B0000636F70792E737265C1
    202     } else {
    203 	set srecfile ${copyfile}.srec
    204 	set header_string S0130000746D706469722F636F70792E7372656397
    205     }
    206 
    207     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"]
    208 
    209     if ![string equal "" $got] then {
    210 	fail "objcopy -O srec"
    211     } else {
    212 	if [is_remote host] {
    213 	    remote_upload host ${srecfile} tmpdir/copy.srec
    214 	    set srecfile tmpdir/copy.srec
    215 	}
    216 	set file [open ${srecfile} r]
    217 
    218 	# The first S record is fixed by the file name we are using.
    219 	gets $file line
    220 	send_log "$line\n"
    221 	verbose $line
    222 	if ![regexp "$header_string.*" $line] {
    223 	    send_log "bad header\n"
    224 	    fail "objcopy -O srec"
    225 	} else {
    226 	    while {[gets $file line] != -1 \
    227 		       && [regexp "^S\[123\]\[0-9a-fA-F\]+\[\r\n\]*$" $line]} {
    228 		send_log "$line\n"
    229 		verbose $line
    230 		set line "**EOF**"
    231 	    }
    232 	    send_log "$line\n"
    233 	    verbose $line
    234 	    if ![regexp "^S\[789\]\[0-9a-fA-F\]+\[\r\n\]*$" $line] then {
    235 		send_log "bad trailer\n"
    236 		fail "objcopy -O srec"
    237 	    } else {
    238 		if {[gets $file line] != -1} then {
    239 		    send_log "garbage at end\n"
    240 		    send_log "$line\n"
    241 		    verbose $line
    242 		    fail "objcopy -O srec"
    243 		} else {
    244 		    set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${srecfile}"]
    245 		    if ![regexp "file format srec" $got] then {
    246 			send_log "objdump failed\n"
    247 			fail "objcopy -O srec"
    248 		    } else {
    249 			pass "objcopy -O srec"
    250 		    }
    251 		}
    252 	    }
    253 	}
    254 
    255 	close $file
    256     }
    257 }
    258 
    259 # Test setting and adjusting the start address.  We only test this
    260 # while generating S records, because we may not be able to set the
    261 # start address for other object file formats, and the S record case
    262 # is the only useful one anyhow.
    263 
    264 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $tempfile"]
    265 if ![regexp "start address (\[0-9a-fA-FxX\]+)" $got all origstart] then {
    266     perror "objdump can not recognize bintest.o"
    267     set origstart ""
    268 } else {
    269     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --set-start 0x7654 $tempfile ${copyfile}.srec"]
    270     if ![string equal "" $got] then {
    271 	fail "objcopy --set-start"
    272     } else {
    273 	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
    274 	if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
    275 	    fail "objcopy --set-start"
    276 	} else {
    277 	    if {$srecstart != 0x7654} then {
    278 		send_log "$srecstart != 0x7654\n"
    279 		fail "objcopy --set-start"
    280 	    } else {
    281 		pass "objcopy --set-start"
    282 	    }
    283 	}
    284     }
    285 
    286     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-start 0x123 $tempfile ${copyfile}.srec"]
    287     if ![string equal "" $got] then {
    288 	fail "objcopy --adjust-start"
    289     } else {
    290 	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
    291 	if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
    292 	    fail "objcopy --adjust-start"
    293 	} else {
    294 	    if {$srecstart != $origstart + 0x123} then {
    295 		send_log "$srecstart != $origstart + 0x123\n"
    296 		fail "objcopy --adjust-start"
    297 	    } else {
    298 		pass "objcopy --adjust-start"
    299 	    }
    300 	}
    301     }
    302 }
    303 
    304 # Test adjusting the overall VMA, and adjusting the VMA of a
    305 # particular section.  We again only test this when generating S
    306 # records.
    307 
    308 set low ""
    309 set lowname ""
    310 
    311 set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"]
    312 
    313 set headers_regexp "\[ 	0-9\]+(\[^ 	\]+)\[ 	\]*(\[0-9a-fA-F\]+)\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+2\[*\]\[*\]\[0-9\]+(.*)"
    314 
    315 set got $headers
    316 while {[regexp $headers_regexp $got all name size vma rest]} {
    317     set vma 0x$vma
    318     set size 0x$size
    319     if {$size != 0} {
    320 	if {$low == "" || $vma < $low} {
    321             set low $vma
    322 	    set lowname $name
    323 	}
    324     }
    325     set got $rest
    326 }
    327 
    328 if {$low == "" || $origstart == ""} then {
    329     perror "objdump can not recognize bintest.o"
    330 } else {
    331     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-vma 0x123 $tempfile ${copyfile}.srec"]
    332     if ![string equal "" $got] then {
    333         fail "objcopy --adjust-vma"
    334     } else {
    335 	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -fh ${copyfile}.srec"]
    336 	set want "file format srec.*start address\[ 	\]*(\[0-9a-fA-FxX\]+).*sec1\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)"
    337 	if ![regexp $want $got all start vma] then {
    338 	    fail "objcopy --adjust-vma"
    339 	} else {
    340 	    set vma 0x$vma
    341 	    if {$vma != $low + 0x123} then {
    342 		send_log "$vma != $low + 0x123\n"
    343 		fail "objcopy --adjust-vma"
    344 	    } else {
    345 		if {$start != $origstart + 0x123} then {
    346 		    send_log "$start != $origstart + 0x123\n"
    347 		    fail "objcopy --adjust-vma"
    348 		} else {
    349 		    pass "objcopy --adjust-vma"
    350 		}
    351 	    }
    352 	}
    353     }
    354 
    355     set arg ""
    356     set got $headers
    357     while {[regexp $headers_regexp $got all name size vma rest]} {
    358 	set vma 0x$vma
    359 	if {$vma == $low} then {
    360 	    set arg "$arg --adjust-section-vma $name+4"
    361 	}
    362 	set got $rest
    363     }
    364 
    365     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $arg $tempfile ${copyfile}.srec"]
    366     if ![string equal "" $got] then {
    367 	fail "objcopy --adjust-section-vma +"
    368     } else {
    369 	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
    370 	set want "file format srec.*sec1\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)"
    371 	if ![regexp $want $got all vma] then {
    372 	    fail "objcopy --adjust-section-vma +"
    373 	} else {
    374 	    set vma 0x$vma
    375 	    if {$vma != $low + 4} then {
    376 		send_log "$vma != $low + 4\n"
    377 		fail "objcopy --adjust-section-vma +"
    378 	    } else {
    379 		pass "objcopy --adjust-section-vma +"
    380 	    }
    381 	}
    382     }
    383 
    384     regsub -all "\\+4" $arg "=[expr $low + 4]" argeq
    385     set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $argeq $tempfile ${copyfile}.srec"]
    386     if ![string equal "" $got] then {
    387 	fail "objcopy --adjust-section-vma ="
    388     } else {
    389 	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
    390 	set want "file format srec.*sec1\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)"
    391 	if ![regexp $want $got all vma] then {
    392 	    fail "objcopy --adjust-section-vma ="
    393 	} else {
    394 	    set vma 0x$vma
    395 	    if {$vma != $low + 4} then {
    396 		send_log "$vma != $low + 4\n"
    397 		fail "objcopy --adjust-section-vma ="
    398 	    } else {
    399 		pass "objcopy --adjust-section-vma ="
    400 	    }
    401 	}
    402     }
    403 }
    404 
    405 # Test stripping an object.
    406 
    407 proc strip_test { } {
    408     global AR
    409     global CC
    410     global STRIP
    411     global STRIPFLAGS
    412     global NM
    413     global NMFLAGS
    414     global srcdir
    415     global subdir
    416     global READELF
    417 
    418     set test "strip"
    419 
    420     if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
    421 	untested $test
    422 	return
    423     }
    424 
    425     set osabi_fail "false"
    426     if [is_elf_format] {
    427 	verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.in"
    428 	set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.in"]
    429 	if { [lindex $exec_output 0] != 0 } then {
    430 	    unresolved "$test preserving OS/ABI"
    431 	    set osabi_fail "true"
    432 	} else {
    433 	    verbose -log "grep OS/ABI tmpdir/osabi.in"
    434 	    catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
    435 	}
    436     }
    437 
    438     if [is_remote host] {
    439 	set archive libstrip.a
    440 	set objfile [remote_download host tmpdir/testprog.o]
    441 	remote_file host delete $archive
    442     } else {
    443 	set archive tmpdir/libstrip.a
    444 	set objfile tmpdir/testprog.o
    445     }
    446 
    447     remote_file build delete tmpdir/libstrip.a
    448 
    449     set exec_output [binutils_run $AR "rc $archive ${objfile}"]
    450     if ![string equal "" $exec_output] {
    451 	fail $test
    452 	unresolved "$test preserving OS/ABI"
    453 	return
    454     }
    455 
    456     set exec_output [binutils_run $STRIP "-g $archive"]
    457     if ![string equal "" $exec_output] {
    458 	fail $test
    459 	unresolved "$test preserving OS/ABI"
    460 	return
    461     }
    462 
    463     set exec_output [binutils_run $STRIP "$STRIPFLAGS $archive"]
    464     if ![string equal "" $exec_output] {
    465 	fail $test
    466 	unresolved "$test preserving OS/ABI"
    467 	return
    468     }
    469 
    470     if { $osabi_fail != "true" && [is_elf_format] } {
    471 	verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.out"
    472 	set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.out"]
    473 	if { [lindex $exec_output 0] != 0 } then {
    474 	    unresolved "$test preserving OS/ABI"
    475 	} else {
    476 	    verbose -log "grep OS/ABI tmpdir/osabi.out"
    477 	    catch "exec grep OS/ABI tmpdir/osabi.out" osabi_out
    478 	    if { "$osabi_in" == "$osabi_out" } {
    479 		pass "$test preserving OS/ABI"
    480 	    } else {
    481 		fail "$test preserving OS/ABI"
    482 	    }
    483 	}
    484     }
    485 
    486     if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
    487 	untested $test
    488 	return
    489     }
    490 
    491     if [is_remote host] {
    492 	set objfile [remote_download host tmpdir/testprog.o]
    493     } else {
    494 	set objfile tmpdir/testprog.o
    495     }
    496 
    497     set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"]
    498     if ![string equal "" $exec_output] {
    499 	fail $test
    500 	return
    501     }
    502 
    503     set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"]
    504     if ![string match "*: no symbols*" $exec_output] {
    505 	fail $test
    506 	return
    507     }
    508 
    509     pass $test
    510 }
    511 
    512 strip_test
    513 
    514 # Test stripping an object file with saving a symbol
    515 
    516 proc strip_test_with_saving_a_symbol { } {
    517     global CC
    518     global STRIP
    519     global STRIPFLAGS
    520     global NM
    521     global NMFLAGS
    522     global srcdir
    523     global subdir
    524 
    525     set test "strip with saving a symbol"
    526 
    527     if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
    528 	untested $test
    529 	return
    530     }
    531 
    532     if [is_remote host] {
    533 	set objfile [remote_download host tmpdir/testprog.o]
    534     } else {
    535 	set objfile tmpdir/testprog.o
    536     }
    537 
    538     set exec_output [binutils_run $STRIP "$STRIPFLAGS -K main -K _main $objfile"]
    539     if ![string equal "" $exec_output] {
    540 	fail $test
    541 	return
    542     }
    543 
    544     set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
    545     if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
    546          && ![regexp {^([0-9a-fA-F]+)?[ ]+T _main} $exec_output]} {
    547 	fail $test
    548 	return
    549     }
    550 
    551     pass $test
    552 }
    553 
    554 strip_test_with_saving_a_symbol
    555 
    556 # Build a final executable.
    557 
    558 if { [istarget *-*-cygwin] || [istarget *-*-mingw*] } {
    559     set test_prog "testprog.exe"
    560 } else {
    561     set test_prog "testprog"
    562 }
    563 
    564 proc copy_setup { } {
    565     global srcdir
    566     global subdir
    567     global gcc_gas_flag
    568     global test_prog
    569     global host_triplet
    570 
    571     set res [build_wrapper testglue.o]
    572     set flags { debug }
    573 
    574     if { [istarget *-*-uclinux*] && ![istarget tic6x-*-*] } {
    575 	return 1
    576     }
    577 
    578     if { $res != "" } {
    579 	lappend flags "additional_flags=[lindex $res 1]"
    580 	set add_libs "testglue.o"
    581     } else {
    582 	set add_libs ""
    583     }
    584 
    585     if { [istarget *-*-linux*]
    586 	 || [istarget *-*-gnu*] } {
    587 	foreach i $gcc_gas_flag {
    588 	    set flags "additional_flags=$i $flags"
    589 	}
    590     }
    591     if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/$test_prog executable $flags]  != "" } {
    592 	return 2
    593     }
    594 
    595     set result [remote_load target tmpdir/$test_prog]
    596     set status [lindex $result 0]
    597 
    598     if { $status != "pass"  } {
    599 	send_log "cannot run executable, status = ${status} on ${host_triplet}\n"
    600 	return 3
    601     }
    602 
    603     return 0
    604 }
    605 
    606 # Test copying an executable.
    607 
    608 proc copy_executable { prog flags test1 test2 } {
    609     global test_prog
    610 
    611     if [is_remote host] {
    612 	set testfile [remote_download host tmpdir/$test_prog]
    613 	set testcopy copyprog
    614     } else {
    615 	set testfile tmpdir/$test_prog
    616 	set testcopy tmpdir/copyprog
    617     }
    618     remote_file host delete $testcopy
    619 
    620     set exec_output [binutils_run $prog "$flags $testfile $testcopy"]
    621 
    622     if ![string equal "" $exec_output] {
    623 	fail $test1
    624 	if [string equal "" $test2] {
    625 	    return
    626 	}
    627 	fail $test2
    628 	return
    629     }
    630 
    631     if [is_remote host] {
    632 	remote_upload host $testcopy tmpdir/copyprog
    633     }
    634 
    635     set status [remote_exec build "cmp" "tmpdir/$test_prog tmpdir/copyprog"]
    636     set exec_output [lindex $status 1]
    637 
    638     if [string equal "" $exec_output] then {
    639 	pass $test1
    640     } else {
    641 	send_log "$exec_output\n"
    642 	verbose "$exec_output"
    643 
    644 	# This will fail for many reasons.  For example, it will most
    645 	# likely fail if a non-GNU linker is used.  Therefore, we do
    646 	# not insist that it pass.  If you are using an assembler and
    647 	# linker based on the same BFD as objcopy, it is worth
    648 	# investigating to see why this failure occurs.  If we are
    649 	# cross compiling, we assume that a GNU linker is being used,
    650 	# and expect it to succeed.
    651 	if {[isnative]} then {
    652 	    setup_xfail "*-*-*"
    653 	}
    654 
    655 	# This also fails for some mips targets.  See elf32-mips.c
    656 	# mips_elf_sym_is_global.
    657 	if { [is_bad_symtab] } then {
    658 	    setup_xfail "*-*-*"
    659 	}
    660 
    661 	setup_xfail "arm*-*-coff"
    662 	setup_xfail "arm*-*-pe"
    663 	setup_xfail "*-*-mingw*"
    664 	setup_xfail "*-*-cygwin*"
    665 
    666 	fail $test1
    667     }
    668 
    669     if [string equal "" $test2] {
    670 	return
    671     }
    672 
    673     set output [remote_load target tmpdir/copyprog]
    674     set status [lindex $output 0]
    675     if { $status != "pass" } {
    676 	fail $test2
    677     } else {
    678 	pass $test2
    679     }
    680 }
    681 
    682 # Test stripping an executable
    683 
    684 proc strip_executable { prog flags test1 test2 } {
    685     global NM
    686     global NMFLAGS
    687     global READELF
    688 
    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]
    693     } else {
    694 	set copyfile tmpdir/striprog
    695     }
    696 
    697     set osabi_fail "false"
    698     if [is_elf_format] {
    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"
    704 	} else {
    705 	    verbose -log "grep OS/ABI tmpdir/osabi.in"
    706 	    catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
    707 	}
    708      }
    709 
    710     set exec_output [binutils_run $prog "$flags ${copyfile}"]
    711     if ![string equal "" $exec_output] {
    712 	fail $test1
    713 	if [string equal "" $test2] {
    714 	    return
    715 	}
    716 	fail $test2
    717 	return
    718     }
    719 
    720     if [is_remote host] {
    721 	remote_upload host ${copyfile} tmpdir/striprog
    722     }
    723 
    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"
    729 	} else {
    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"
    734 	    } else {
    735 		fail "$test1 preserving OS/ABI"
    736 	    }
    737 	}
    738     }
    739 
    740     set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
    741     if ![string match "*: no symbols*" $exec_output] {
    742 	fail $test1
    743 	return
    744     }
    745 
    746     if [string equal "" $test2] {
    747 	return
    748     }
    749 
    750     set result [remote_load target tmpdir/striprog]
    751     set status [lindex $result 0]
    752     if { $status != "pass" } {
    753 	fail $test2
    754         return
    755     }
    756 
    757     pass $test2
    758 }
    759 
    760 # Test stripping an executable with saving a symbol
    761 
    762 proc strip_executable_with_saving_a_symbol { prog flags test1 test2 } {
    763     global NM
    764     global NMFLAGS
    765 
    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]
    770     } else {
    771 	set copyfile tmpdir/striprog
    772     }
    773 
    774     set exec_output [binutils_run $prog "$flags ${copyfile}"]
    775     if ![string equal "" $exec_output] {
    776 	fail $test1
    777 	if [string equal "" $test2] {
    778 	    return
    779 	}
    780 	fail $test2
    781 	return
    782     }
    783 
    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
    788 	# this test.
    789 
    790 	# Using "" not {} to get the \n and \r translated.
    791 	regsub "^\[0-9a-fA-F\]+\[ \]+T Main\[\n\r\]+" $exec_output "" exec_output
    792     }
    793 
    794     if {![regexp {^([0-9a-fA-F]+)?[ ]+[TD] main} $exec_output] \
    795          && ![regexp {^([0-9a-fA-F]+)?[ ]+[TD] _main} $exec_output]} {
    796 	fail $test1
    797 	return
    798     }
    799 
    800     if [string equal "" $test2] {
    801 	return
    802     }
    803 
    804     if [is_remote host] {
    805 	remote_upload host ${copyfile} tmpdir/striprog
    806     }
    807 
    808     set result [remote_load target tmpdir/striprog]
    809     set status [lindex $result 0]
    810     if { $status != "pass" } {
    811 	fail $test2
    812         return
    813     }
    814 
    815     pass $test2
    816 }
    817 
    818 # Test keeping only debug symbols of an executable
    819 
    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]
    825     } else {
    826 	set copyfile tmpdir/striprog
    827     }
    828 
    829     set exec_output [binutils_run $prog1 "$flags1 ${copyfile}"]
    830     if ![string equal "" $exec_output] {
    831 	fail $test1
    832 	return
    833     }
    834     pass $test1
    835 
    836     set exec_output [binutils_run $prog2 "$flags2 ${copyfile}"]
    837     if ![string equal "" $exec_output] {
    838 	fail $test2
    839 	return
    840     }
    841     pass $test2
    842 }
    843 
    844 # Tests that in a debug only copy of a file the sections
    845 # headers whoes types have been changed to NOBITS still
    846 # retain their sh_link fields.
    847 
    848 proc keep_debug_symbols_and_check_links { prog flags test } {
    849     global READELF
    850 
    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]
    855     } else {
    856 	set copyfile tmpdir/striprog
    857     }
    858 
    859     set exec_output [binutils_run $prog "$flags ${copyfile}"]
    860     if ![string equal "" $exec_output] {
    861 	fail $test
    862 	return
    863     }
    864 
    865     set got [binutils_run $READELF "-S --wide ${copyfile}"]
    866 
    867     set fails 0
    868     # Regexp to match a section with NOBITS type and extract its name and sh_link fields
    869     while {[regexp \
    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]} {
    872 	set sh_link 0x$link
    873 	if {$sh_link == 0} {
    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"
    877 	    switch $name {
    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" }
    886 	    }
    887 	}
    888 	set got $rest
    889     }
    890 
    891     if {$fails == 0} {
    892 	pass $test
    893     } else {
    894 	fail $test
    895     }
    896 }
    897 
    898 
    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"
    907 if [is_elf_format] {
    908     set test6 "NOBITS sections retain sh_link field"
    909 }
    910 
    911 switch [copy_setup] {
    912     "1" {
    913 	# do nothing
    914     }
    915     "2" {
    916 	untested $test1
    917 	untested $test1r
    918 	untested $test2
    919 	untested $test2r
    920 	untested $test3
    921 	untested $test3r
    922 	untested $test4
    923 	untested $test5
    924 	if [is_elf_format] {
    925 	    untested $test6
    926 	}
    927     }
    928     "3" {
    929 	copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" ""
    930 	unsupported $test1r
    931 	strip_executable "$STRIP" "$STRIPFLAGS" "$test2" ""
    932 	unsupported $test2r
    933 	strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test3" ""
    934 	unsupported $test3r
    935 	keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test4" \
    936 					 "$OBJCOPY" "$OBJCOPYFLAGS" "$test5"
    937 	if [is_elf_format] {
    938 	    keep_debug_symbols_and_check_links "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test6"
    939 	}
    940     }
    941     "0" {
    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"
    947 	if [is_elf_format] {
    948 	    keep_debug_symbols_and_check_links "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test6"
    949 	}
    950     }
    951 }
    952 
    953 proc objcopy_test_readelf {testname srcfile} {
    954     global OBJCOPY
    955     global OBJCOPYFLAGS
    956     global READELF
    957     global srcdir
    958     global subdir
    959 
    960     if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
    961 	unresolved "objcopy ($testname)"
    962 	return
    963     }
    964 
    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)"
    970 	return
    971     }
    972 
    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)"
    977 	return
    978     }
    979     set exec_output [prune_warnings [lindex $exec_output 1]]
    980     if ![string equal "" $exec_output] then {
    981 	unresolved "objcopy ($testname)"
    982 	return
    983     }
    984 
    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)"
    989 	return
    990     }
    991     set exec_output [prune_warnings [lindex $exec_output 1]]
    992     if ![string equal "" $exec_output] then {
    993 	unresolved "objcopy ($testname)"
    994 	return
    995     }
    996 
    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]
   1000 
   1001     if [string equal "" $exec_output] then {
   1002 	pass "objcopy ($testname)"
   1003     } else {
   1004 	fail "objcopy ($testname)"
   1005     }
   1006 }
   1007 
   1008 proc objcopy_test_symbol_manipulation {} {
   1009     global srcdir
   1010     global subdir
   1011 
   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]
   1017     }
   1018 }
   1019 
   1020 proc objcopy_test_elf_common_symbols {} {
   1021     global srcdir
   1022     global subdir
   1023 
   1024     # hpux has a non-standard common directive.
   1025     if { [istarget "*-*-hpux*"] } then {
   1026 	return
   1027     }
   1028 
   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]
   1034     }
   1035 }
   1036 
   1037 # ia64 specific tests
   1038 if { ([istarget "ia64-*-elf*"]
   1039        || [istarget "ia64-*-linux*"]) } {
   1040     objcopy_test "ia64 link order" link-order.s
   1041 }
   1042 
   1043 # ELF specific tests
   1044 if [is_elf_format] {
   1045     objcopy_test_symbol_manipulation
   1046     objcopy_test_elf_common_symbols
   1047     objcopy_test "ELF unknown section type" unknown.s
   1048     objcopy_test_readelf "ELF group" group.s
   1049     objcopy_test_readelf "ELF group" group-2.s
   1050     objcopy_test_readelf "ELF group" group-3.s
   1051     objcopy_test_readelf "ELF group" group-4.s
   1052     run_dump_test "group-5"
   1053     run_dump_test "group-6"
   1054     run_dump_test "copy-1"
   1055     run_dump_test "note-1"
   1056 }
   1057 
   1058 run_dump_test "copy-2"
   1059 run_dump_test "copy-3"
   1060 run_dump_test "copy-4"
   1061 run_dump_test "pr19020a"
   1062 run_dump_test "pr19020b"
   1063 
   1064 if [is_elf_format] {
   1065     run_dump_test "strip-1"
   1066     run_dump_test "strip-2"
   1067     run_dump_test "strip-3"
   1068     run_dump_test "strip-4"
   1069     run_dump_test "strip-5"
   1070     run_dump_test "strip-6"
   1071     run_dump_test "strip-7"
   1072     run_dump_test "strip-8"
   1073     run_dump_test "strip-9"
   1074     run_dump_test "strip-12"
   1075     # This requires STB_GNU_UNIQUE support with OSABI set to GNU.
   1076     if { [supports_gnu_unique] } {
   1077 	run_dump_test "strip-10"
   1078     }
   1079     set extra_strip11 ""
   1080     if { [istarget "sh64*-*"] } {
   1081 	# pr17755 testcase
   1082 	set extra_strip11 { { "as" "--isa=SHmedia --abi=64" } }
   1083     }
   1084     run_dump_test "strip-11" $extra_strip11
   1085 
   1086     if { [istarget "i*86-*"] || [istarget "x86_64-*-*"] } {
   1087 	# Check to make sure we don't strip a symbol named in relocations.
   1088 	set test "objcopy keeps symbols needed by relocs"
   1089 
   1090 	set srcfile $srcdir/$subdir/needed-by-reloc.s
   1091 
   1092 	if {![binutils_assemble $srcfile tmpdir/bintest.o]} then {
   1093 	    unresolved $test
   1094 	} else {
   1095 	    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-symbol=foo tmpdir/bintest.o ${copyfile}.o"]
   1096 
   1097 	    if [regexp "not stripping symbol `foo' because it is named in a relocation" $got] {
   1098 		pass $test
   1099 	    } else {
   1100 		fail $test
   1101 	    }
   1102 	}
   1103     }
   1104 
   1105     # The symbol table for some MIPS targets is sorted differently than
   1106     # the ELF canonical order, so the regexps in localize-hidden-1.d fail
   1107     # to match.
   1108     if { [is_bad_symtab] } then {
   1109 	setup_xfail "*-*-*"
   1110     }
   1111     run_dump_test "localize-hidden-1"
   1112     run_dump_test "testranges"
   1113     run_dump_test "testranges-ia64"
   1114 
   1115     run_dump_test "add-section"
   1116     run_dump_test "add-symbol"
   1117     run_dump_test "add-empty-section"
   1118 
   1119     run_dump_test "exclude-1a"
   1120     run_dump_test "exclude-1b"
   1121 }
   1122 run_dump_test "localize-hidden-2"
   1123 
   1124 # Test objcopying an object file without global symbol
   1125 
   1126 proc objcopy_test_without_global_symbol { } {
   1127     global OBJCOPY
   1128     global OBJCOPYFLAGS
   1129     global OBJDUMP
   1130     global OBJDUMPFLAGS
   1131     global srcdir
   1132     global subdir
   1133 
   1134     set test "strip without global symbol "
   1135 
   1136     if { [target_compile $srcdir/$subdir/pr19547.c tmpdir/pr19547.o object debug] != "" } {
   1137 	untested $test
   1138 	return
   1139     }
   1140 
   1141     if [is_remote host] {
   1142 	set objfile [remote_download host tmpdir/pr19547.o]
   1143     } else {
   1144 	set objfile tmpdir/pr19547.o
   1145     }
   1146 
   1147     set exec_output [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-unneeded $objfile"]
   1148     if ![string equal "" $exec_output] {
   1149 	fail $test
   1150 	return
   1151     }
   1152 
   1153     set exec_output [binutils_run $OBJDUMP "$OBJDUMPFLAGS -t $objfile"]
   1154     if {![regexp "no symbols" $exec_output]} {
   1155 	fail $test
   1156 	return
   1157     }
   1158 
   1159     pass $test
   1160 }
   1161 
   1162 # The AArch64 and ARM targets preserve mapping symbols
   1163 # in object files, so they will fail this test.
   1164 setup_xfail aarch64*-*-* arm*-*-*
   1165 
   1166 objcopy_test_without_global_symbol
   1167