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