#   Copyright (C) 1994-2026 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.

# Please email any bugs, comments, and/or additions to this file to:
# bug-dejagnu@prep.ai.mit.edu

# Written by Ian Lance Taylor <ian@cygnus.com>

if ![is_remote host] {
    if {[which $OBJCOPY] == 0} then {
        perror "$OBJCOPY does not exist"
        return
    }
}

send_user "Version [binutil_version $OBJCOPY]"

if ![is_remote host] {
    set tempfile tmpdir/bintest.o
    set copyfile tmpdir/copy
} else {
    set tempfile [remote_download host tmpdir/bintest.o]
    set copyfile copy
}

# Test that objcopy does not modify a file when copying it.
# "object" or "executable" values for type are supported.

proc objcopy_test {testname srcfile type asflags ldflags} {
    global OBJCOPY
    global OBJCOPYFLAGS
    global srcdir
    global subdir
    global tempfile
    global copyfile
    set t_tempfile $tempfile
    set t_copyfile ${copyfile}.o

    if { $type != "object" && $type != "executable" } {
	error "objcopy_test accepts only \"object\" or \"executable\" values for type"
    }

    if {![binutils_assemble_flags $srcdir/$subdir/${srcfile} $t_tempfile "$asflags"]} then {
	unsupported "objcopy $type ($testname)"
	remote_file host delete $t_tempfile
	return
    }

    set xflags ""
    if { $type == "executable" } {
	global LD
	# Check that LD exists
	if {[which $LD] == 0} then {
	    untested "objcopy $type ($testname)"
	    return
	}

	# Use tempfile and copyfile without the .o extension for executable files
	set t_tempfile [string range $tempfile 0 end-2]
	set t_copyfile $copyfile
	set got [binutils_run $LD "$tempfile -o $t_tempfile $ldflags"]
	if { ![string equal "" $got] } then {
	    unsupported "objcopy $type ($testname)"
	    return
	}
	set xflags "--preserve-dates"
	sleep 1
    }

    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS $xflags $t_tempfile $t_copyfile"]

    if ![string equal "" $got] then {
	send_log "$got\n"
	fail "objcopy $type ($testname)"
    } else {
	send_log "cmp $t_tempfile $t_copyfile\n"
	verbose "cmp $t_tempfile $t_copyfile"
	if [is_remote host] {
	    set src1 tmpdir/bintest
	    set src2 tmpdir/copy
	    remote_upload host $t_tempfile $src1
	    remote_upload host $t_copyfile $src2
	} else {
	    set src1 $t_tempfile
	    set src2 $t_copyfile
	}
	set status [remote_exec build cmp "${src1} ${src2}"]
	set exec_output [lindex $status 1]
	set exec_output [prune_warnings $exec_output]

	if [string equal "" $exec_output] then {
	    pass "objcopy $type ($testname)"
	    if { $type == "executable" } {
		set dir [file dirname $t_copyfile]
		set f2 [file tail $t_copyfile]
		set status [remote_exec host find "$dir -name $f2 -newer $t_tempfile -print"]
		set exec_output [lindex $status 1]
		if [string equal "" $exec_output] then {
		    pass "objcopy $type ($testname) timestamp"
		} else {
		    fail "objcopy $type ($testname) timestamp"
		}
	    }
	} else {
	    send_log "$exec_output\n"
	    verbose "$exec_output" 1

	    # On OSF/1, this succeeds with gas and fails with /bin/as.
	    setup_xfail "alpha*-*-osf*"

	    fail "objcopy $type ($testname)"
	}
    }
}

setup_xfail "hppa*-*-*"
setup_xfail "tic54x-*-*"
clear_xfail "hppa*64*-*-hpux*" "hppa*-*-linux*" "hppa*-*-lites*"
clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-*elf*"
objcopy_test "simple copy" bintest.s object "" ""

# Test verilog data width
proc objcopy_test_verilog {testname} {
    global OBJCOPY
    global OBJCOPYFLAGS
    global srcdir
    global subdir
    global copyfile
    set binfile tmpdir/verilogtest.o
    set verilog tmpdir/verilog

    set got [binutils_assemble $srcdir/$subdir/verilogtest.s $binfile]
    if {![binutils_assemble $srcdir/$subdir/verilogtest.s $binfile]} then {
	unsupported "objcopy ($testname)"
	return
    }

    set got [binutils_run $OBJCOPY "-O verilog $binfile $verilog"]
    if ![string equal "" $got] then {
	fail "objcopy ($testname)"
    }

    set got [binutils_run $OBJCOPY "-O verilog --verilog-data-width 0 $binfile $verilog-0.hex"]
    if ![regexp "error: verilog data width must be 1, 2, 4, 8 or 16" $got] then {
	fail "objcopy ($testname 0) {$got}"
    } else {
	pass "objcopy ($testname 0)"
    }

    foreach width {1 2} {
	set got [binutils_run $OBJCOPY "-O verilog --verilog-data-width $width $binfile $verilog-$width.hex"]
	if ![string equal "" $got] then {
	    fail "objcopy ($testname $width)"
	}
        send_log "regexp_diff $verilog-$width.hex $srcdir/$subdir/verilog-$width.hex\n"
	if {! [regexp_diff "$verilog-$width.hex" "$srcdir/$subdir/verilog-$width.hex"]} {
	    pass "objcopy ($testname $width)"
	} else {
	    fail "objcopy ($testname $width)"
	}
    }

    # 16-bit little-endian targets fail the following tests because the
    # verilog backend does not convert from 16-bits to 32-bits before it
    # converts from internal format to little endian format.
    if { [istarget tic54*-*-*] || [istarget pdp11-*-*] } {
	untested "verilog width-4 and width-8 tests"
	return
    }

    foreach width {4 8} {
	set got [binutils_run $OBJCOPY "-O verilog --verilog-data-width $width $binfile $verilog-$width.hex"]
	if ![string equal "" $got] then {
	    fail "objcopy ($testname $width)"
	}
        send_log "regexp_diff $verilog-$width.hex $srcdir/$subdir/verilog-$width.hex\n"
	if {! [regexp_diff "$verilog-$width.hex" "$srcdir/$subdir/verilog-$width.hex"]} {
	    pass "objcopy ($testname $width)"
	} else {
	    fail "objcopy ($testname $width)"
	}
    }

    # Test generating endian correct output.
    set testname "objcopy (verilog output endian-ness == input endian-ness)"
    set got [binutils_run $OBJCOPY "-O verilog --verilog-data-width 4 $binfile $verilog-I4.hex"]
    if ![string equal "" $got] then {
	fail $testname
    }
    send_log "regexp_diff $verilog-I4.hex $srcdir/$subdir/verilog-I4.hex\n"
    if {! [regexp_diff "$verilog-I4.hex" "$srcdir/$subdir/verilog-I4.hex"]} {
	pass $testname
    } else {
	fail $testname
    }
}

objcopy_test_verilog "verilog data width"

if { [file exists $tempfile] } {
    # Test reversing bytes in a section.

    set reversed ${tempfile}-reversed
    set sect_names [get_standard_section_names]
    if { $sect_names != "" } {
	if { [istarget hppa*-*-hpux*] } {
	    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j \$PRIVATE\$ -j [lindex $sect_names 1] --reverse-bytes=4 $tempfile $reversed"]
	} else {
	    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j [lindex $sect_names 1] --reverse-bytes=4 $tempfile $reversed"]
	}
    } else {
	set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -j .data --reverse-bytes=4 $tempfile $reversed"]
    }

    if ![string equal "" $got] then {
	fail "objcopy --reverse-bytes"
    } else {
	if [is_remote host] {
	    remote_upload host ${reversed} tmpdir/copy-reversed.o
	    set reversed tmpdir/copy-reversed.o
	}

	set origdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $tempfile"]
	set  revdata [binutils_run $OBJDUMP "$OBJDUMPFLAGS -s -j .data $reversed"]

	set want "^ \[0-9\]+ (\[0-9\]+)"
	set found_orig [regexp -lineanchor $want $origdata -> origdata]
	set found_rev [regexp -lineanchor $want $revdata -> revdata]

	if {$found_orig == 0 || $found_rev == 0} then {
	    fail "objcopy --reverse-bytes"
	} else {
	    scan $origdata "%2x%2x%2x%2x" b1 b2 b3 b4
	    scan $revdata "%2x%2x%2x%2x" c4 c3 c2 c1

	    if {$b1 == $c1 && $b2 == $c2 && $b3 == $c3 && $b4 == $c4} then {
		pass "objcopy --reverse-bytes"
	    } else {
		fail "objcopy --reverse-bytes"
	    }
	}
    }
}

# Test interleaved copy of multiple byte width

set sequence_file sequence_file
set file [open ${sequence_file} w]
puts ${file} "12345678"
close ${file}

if [is_remote host] {
    remote_upload host ${sequence_file} tmpdir/sequence_file
    set sequence_file tmpdir/sequence_file
}

set got [binutils_run $OBJCOPY "-I binary -i 4 -b 0 --interleave-width 2 ${sequence_file} ${copyfile}"]

file delete sequence_file
remote_file host delete $sequence_file

if ![string equal "" $got] then {
    fail "objcopy -i --interleave-width"
} else {
    if [is_remote host] {
	remote_upload host ${copyfile} tmpdir/interleave_output
	set interleave_output tmpdir/interleave_output
    } else {
	set interleave_output ${copyfile}
    }

    set file [open ${interleave_output} r]
    gets $file line
    send_log "$line\n"
    verbose $line

    if ![string equal "1256" $line] then {
	fail "objcopy -i --interleave-width"
    }
    pass "objcopy -i --interleave-width"

    close $file
}

# Test generating S records.

if { [file exists $tempfile] } {
    # We make the srec filename 8.3 compatible. Note that the header string
    # matched against depends on the name of the file. Ugh.

    if [is_remote host] {
	set srecfile copy.sre
	set header_string S00B0000636F70792E737265C1
    } else {
	set srecfile ${copyfile}.srec
	set header_string S0130000746D706469722F636F70792E7372656397
    }

    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $tempfile ${srecfile}"]

    if ![string equal "" $got] then {
	fail "objcopy -O srec"
    } else {
	if [is_remote host] {
	    remote_upload host ${srecfile} tmpdir/copy.srec
	    set srecfile tmpdir/copy.srec
	}
	set file [open ${srecfile} r]

	# The first S record is fixed by the file name we are using.
	gets $file line
	send_log "$line\n"
	verbose $line
	if ![regexp "$header_string.*" $line] {
	    send_log "bad header\n"
	    fail "objcopy -O srec"
	} else {
	    while {[gets $file line] != -1 \
		       && [regexp "^S\[123\]\[0-9a-fA-F\]+\[\r\n\]*$" $line]} {
		send_log "$line\n"
		verbose $line
		set line "**EOF**"
	    }
	    send_log "$line\n"
	    verbose $line
	    if ![regexp "^S\[789\]\[0-9a-fA-F\]+\[\r\n\]*$" $line] then {
		send_log "bad trailer\n"
		fail "objcopy -O srec"
	    } else {
		if {[gets $file line] != -1} then {
		    send_log "garbage at end\n"
		    send_log "$line\n"
		    verbose $line
		    fail "objcopy -O srec"
		} else {
		    set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${srecfile}"]
		    if ![regexp "file format srec" $got] then {
			send_log "objdump failed\n"
			fail "objcopy -O srec"
		    } else {
			pass "objcopy -O srec"
		    }
		}
	    }
	}

	close $file
    }
}

# Test setting and adjusting the start address.  We only test this
# while generating S records, because we may not be able to set the
# start address for other object file formats, and the S record case
# is the only useful one anyhow.

set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f $tempfile"]
if ![regexp "start address (\[0-9a-fA-FxX\]+)" $got all origstart] then {
    perror "objdump can not recognize bintest.o"
    set origstart ""
} else {
    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --set-start 0x7654 $tempfile ${copyfile}.srec"]
    if ![string equal "" $got] then {
	fail "objcopy --set-start"
    } else {
	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
	if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
	    fail "objcopy --set-start"
	} else {
	    if {$srecstart != 0x7654} then {
		send_log "$srecstart != 0x7654\n"
		fail "objcopy --set-start"
	    } else {
		pass "objcopy --set-start"
	    }
	}
    }

    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-start 0x123 $tempfile ${copyfile}.srec"]
    if ![string equal "" $got] then {
	fail "objcopy --adjust-start"
    } else {
	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -f ${copyfile}.srec"]
	if ![regexp "file format srec.*start address (\[0-9a-fA-FxX\]+)" $got all srecstart] then {
	    fail "objcopy --adjust-start"
	} else {
	    if {$srecstart != $origstart + 0x123} then {
		send_log "$srecstart != $origstart + 0x123\n"
		fail "objcopy --adjust-start"
	    } else {
		pass "objcopy --adjust-start"
	    }
	}
    }
}

# Test adjusting the overall VMA, and adjusting the VMA of a
# particular section.  We again only test this when generating S
# records.

set low ""
set lowname ""

set headers [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h $tempfile"]

set headers_regexp "\[ 	0-9\]+(\[^ 	\]+)\[ 	\]*(\[0-9a-fA-F\]+)\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+2\[*\]\[*\]\[0-9\]+(.*)"

set got $headers
while {[regexp $headers_regexp $got all name size vma rest]} {
    set vma 0x$vma
    set size 0x$size
    if {$size != 0} {
	if {$low == "" || $vma < $low} {
            set low $vma
	    set lowname $name
	}
    }
    set got $rest
}

if {$low == "" || $origstart == ""} then {
    perror "objdump can not recognize bintest.o"
} else {
    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec --adjust-vma 0x123 $tempfile ${copyfile}.srec"]
    if ![string equal "" $got] then {
        fail "objcopy --adjust-vma"
    } else {
	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -fh ${copyfile}.srec"]
	set want "file format srec.*start address\[ 	\]*(\[0-9a-fA-FxX\]+).*sec1\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)"
	if ![regexp $want $got all start vma] then {
	    fail "objcopy --adjust-vma"
	} else {
	    set vma 0x$vma
	    if {$vma != $low + 0x123} then {
		send_log "$vma != $low + 0x123\n"
		fail "objcopy --adjust-vma"
	    } else {
		if {$start != $origstart + 0x123} then {
		    send_log "$start != $origstart + 0x123\n"
		    fail "objcopy --adjust-vma"
		} else {
		    pass "objcopy --adjust-vma"
		}
	    }
	}
    }

    set arg ""
    set got $headers
    while {[regexp $headers_regexp $got all name size vma rest]} {
	set vma 0x$vma
	if {$vma == $low} then {
	    set arg "$arg --adjust-section-vma $name+4"
	}
	set got $rest
    }

    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $arg $tempfile ${copyfile}.srec"]
    if ![string equal "" $got] then {
	fail "objcopy --adjust-section-vma +"
    } else {
	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
	set want "file format srec.*sec1\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)"
	if ![regexp $want $got all vma] then {
	    fail "objcopy --adjust-section-vma +"
	} else {
	    set vma 0x$vma
	    if {$vma != $low + 4} then {
		send_log "$vma != $low + 4\n"
		fail "objcopy --adjust-section-vma +"
	    } else {
		pass "objcopy --adjust-section-vma +"
	    }
	}
    }

    regsub -all "\\+4" $arg "=[expr $low + 4]" argeq
    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS -O srec $argeq $tempfile ${copyfile}.srec"]
    if ![string equal "" $got] then {
	fail "objcopy --adjust-section-vma ="
    } else {
	set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -h ${copyfile}.srec"]
	set want "file format srec.*sec1\[ 	\]+\[0-9a-fA-F\]+\[ 	\]+(\[0-9a-fA-F\]+)"
	if ![regexp $want $got all vma] then {
	    fail "objcopy --adjust-section-vma ="
	} else {
	    set vma 0x$vma
	    if {$vma != $low + 4} then {
		send_log "$vma != $low + 4\n"
		fail "objcopy --adjust-section-vma ="
	    } else {
		pass "objcopy --adjust-section-vma ="
	    }
	}
    }
}

# Test stripping an object.

proc strip_test { } {
    global AR
    global CC
    global STRIP
    global STRIPFLAGS
    global NM
    global NMFLAGS
    global srcdir
    global subdir
    global READELF

    set test "strip"

    if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
	untested $test
	return
    }

    set osabi_fail "false"
    if [is_elf_format] {
	verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.in"
	set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.in"]
	if { [lindex $exec_output 0] != 0 } then {
	    fail "$test preserving OS/ABI"
	    set osabi_fail "true"
	} else {
	    verbose -log "grep OS/ABI tmpdir/osabi.in"
	    catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
	}
    }

    if [is_remote host] {
	set archive libstrip.a
	set objfile [remote_download host tmpdir/testprog.o]
	remote_file host delete $archive
    } else {
	set archive tmpdir/libstrip.a
	set objfile tmpdir/testprog.o
    }

    remote_file build delete tmpdir/libstrip.a

    set exec_output [binutils_run $AR "rc $archive ${objfile}"]
    set exec_output [prune_warnings $exec_output]
    if ![string equal "" $exec_output] {
	fail $test
	unresolved "$test preserving OS/ABI"
	return
    }

    set exec_output [binutils_run $STRIP "-g $archive"]
    set exec_output [prune_warnings $exec_output]
    if ![string equal "" $exec_output] {
	fail $test
	unresolved "$test preserving OS/ABI"
	return
    }

    set exec_output [binutils_run $STRIP "$STRIPFLAGS $archive"]
    set exec_output [prune_warnings $exec_output]
    if ![string equal "" $exec_output] {
	fail $test
	unresolved "$test preserving OS/ABI"
	return
    }

    if { $osabi_fail != "true" && [is_elf_format] } {
	verbose -log "$READELF -a tmpdir/testprog.o > tmpdir/osabi.out"
	set exec_output [remote_exec host "$READELF -h tmpdir/testprog.o" "" "/dev/null" "tmpdir/osabi.out"]
	if { [lindex $exec_output 0] != 0 } then {
	    fail "$test preserving OS/ABI"
	} else {
	    verbose -log "grep OS/ABI tmpdir/osabi.out"
	    catch "exec grep OS/ABI tmpdir/osabi.out" osabi_out
	    if { "$osabi_in" == "$osabi_out" } {
		pass "$test preserving OS/ABI"
	    } else {
		fail "$test preserving OS/ABI"
	    }
	}
    }

    if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
	untested $test
	return
    }

    if [is_remote host] {
	set objfile [remote_download host tmpdir/testprog.o]
    } else {
	set objfile tmpdir/testprog.o
    }

    set exec_output [binutils_run $STRIP "$STRIPFLAGS $objfile"]
    set exec_output [prune_warnings $exec_output]
    if ![string equal "" $exec_output] {
	fail $test
	return
    }

    set exec_output [binutils_run $NM "-a $NMFLAGS $objfile"]
    set exec_output [prune_warnings $exec_output]
    if ![string match "*: no symbols*" $exec_output] {
	fail $test
	return
    }

    pass $test
}

strip_test

# Test stripping an object file with saving a symbol

proc strip_test_with_saving_a_symbol { } {
    global CC
    global STRIP
    global STRIPFLAGS
    global NM
    global NMFLAGS
    global srcdir
    global subdir

    set test "strip with saving a symbol"

    if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
	untested $test
	return
    }

    if [is_remote host] {
	set objfile [remote_download host tmpdir/testprog.o]
    } else {
	set objfile tmpdir/testprog.o
    }

    set exec_output [binutils_run $STRIP "$STRIPFLAGS -K main -K _main $objfile"]
    set exec_output [prune_warnings $exec_output]
    if ![string equal "" $exec_output] {
	fail $test
	return
    }

    set exec_output [binutils_run $NM "$NMFLAGS $objfile"]
    set exec_output [prune_warnings $exec_output]
    if {![regexp {^([0-9a-fA-F]+)?[ ]+[TtDd] _?main} $exec_output]} {
	fail $test
	return
    }

    pass $test
}

strip_test_with_saving_a_symbol

# Test stripping an archive.

proc strip_test_archive { } {
    global AR
    global CC
    global STRIP
    global srcdir
    global subdir

    set test "strip -g on archive"

    if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
	untested $test
	return
    }

    set stripobjfile tmpdir/striptestprog.o
    set stripobjarchive testprog.o
    if [is_remote host] {
	set archive libstrip.a
	set objfile [remote_download host tmpdir/testprog.o]
	remote_file host delete $archive
	remote_file host delete $stripobjfile
	remote_file host delete $stripobjarchive
    } else {
	set archive tmpdir/libstrip.a
	set objfile tmpdir/testprog.o
	remote_file build delete $stripobjfile
	remote_file build delete $stripobjarchive
    }

    remote_file build delete tmpdir/libstrip.a

    set exec_output [binutils_run $STRIP "-g -o $stripobjfile $objfile"]
    set exec_output [prune_warnings $exec_output]
    if ![string equal "" $exec_output] {
	fail $test
	return
    }

    set exec_output [binutils_run $AR "rc $archive ${objfile}"]
    set exec_output [prune_warnings $exec_output]
    if ![string equal "" $exec_output] {
	fail $test
	return
    }

    set exec_output [binutils_run $STRIP "-g $archive"]
    set exec_output [prune_warnings $exec_output]
    if ![string equal "" $exec_output] {
	fail $test
	return
    }

    set exec_output [binutils_run $AR "x $archive"]
    set exec_output [prune_warnings $exec_output]
    if ![string equal "" $exec_output] {
	fail $test
	return
    }

    if [is_remote host] {
	set stripobjfile [remote_download host $stripobjfile]
	set stripobjarchive [remote_download host $stripobjarchive]
    }

    send_log "cmp $stripobjarchive $stripobjfile\n"
    verbose "cmp $stripobjarchive $stripobjfile"
    set status [remote_exec build cmp "$stripobjarchive $stripobjfile"]
    set exec_output [lindex $status 1]
    set exec_output [prune_warnings $exec_output]

    if [string equal "" $exec_output] then {
	pass $test
    } else {
	fail $test
    }
}

strip_test_archive

# Build a final executable.

set exe [exeext]
set test_prog "testprog${exe}"

proc copy_setup { } {
    global srcdir
    global subdir
    global gcc_gas_flag
    global test_prog
    global host_triplet

    if {[target_info exists needs_status_wrapper] && \
	    [target_info needs_status_wrapper] != "0"} {
	set res [build_wrapper testglue.o]
    } else {
	set res ""
    }
    set flags { debug }

    if { [istarget *-*-uclinux*] && ![istarget tic6x-*-*] && ![istarget arm*-*-uclinuxfdpiceabi] } {
	return 1
    }

    if { $res != "" } {
	lappend flags "additional_flags=[lindex $res 1]"
	set add_libs "testglue.o"
    } else {
	set add_libs ""
    }

    if { [istarget *-*-linux*]
	 || [istarget kvx-*-*]
	 || [istarget *-*-gnu*] } {
	foreach i $gcc_gas_flag {
	    set flags "additional_flags=$i $flags"
	}
    }
    if { [target_compile "$srcdir/$subdir/testprog.c $add_libs" tmpdir/$test_prog executable $flags]  != "" } {
	return 2
    }

    set result [remote_load target tmpdir/$test_prog]
    set status [lindex $result 0]

    if { $status != "pass"  } {
	send_log "cannot run executable, status = ${status} on ${host_triplet}\n"
	return 3
    }

    return 0
}

# Test copying an executable.

proc copy_executable { prog flags test1 test2 } {
    global test_prog

    if [is_remote host] {
	set testfile [remote_download host tmpdir/$test_prog]
	set testcopy copyprog
    } else {
	set testfile tmpdir/$test_prog
	set testcopy tmpdir/copyprog
    }
    remote_file host delete $testcopy

    set exec_output [binutils_run $prog "$flags $testfile $testcopy"]

    if ![string equal "" $exec_output] {
	fail $test1
	if [string equal "" $test2] {
	    return
	}
	fail $test2
	return
    }

    if [is_remote host] {
	remote_upload host $testcopy tmpdir/copyprog
    }

    set status [remote_exec build "cmp" "tmpdir/$test_prog tmpdir/copyprog"]
    set exec_output [lindex $status 1]

    if [string equal "" $exec_output] then {
	pass $test1
    } else {
	send_log "$exec_output\n"
	verbose "$exec_output"

	# This will fail for many reasons.  For example, it will most
	# likely fail if a non-GNU linker is used.  Therefore, we do
	# not insist that it pass.  If you are using an assembler and
	# linker based on the same BFD as objcopy, it is worth
	# investigating to see why this failure occurs.  If we are
	# cross compiling, we assume that a GNU linker is being used,
	# and expect it to succeed.
	if {[isnative]} then {
	    setup_xfail "*-*-*"
	}

	# This also fails for some mips targets.  See elf32-mips.c
	# mips_elf_sym_is_global.
	if { [is_bad_symtab] } then {
	    setup_xfail "*-*-*"
	}

	setup_xfail "arm*-*-pe"
	setup_xfail "*-*-mingw*"
	setup_xfail "*-*-cygwin*"

	fail $test1
    }

    if [string equal "" $test2] {
	return
    }

    set output [remote_load target tmpdir/copyprog]
    set status [lindex $output 0]
    if { $status != "pass" } {
	fail $test2
    } else {
	pass $test2
    }
}

# Test stripping an executable

proc strip_executable { prog flags test1 test2 } {
    global NM
    global NMFLAGS
    global READELF

    remote_file build delete tmpdir/striprog
    remote_download build tmpdir/copyprog tmpdir/striprog
    if [is_remote host] {
	set copyfile [remote_download host tmpdir/striprog]
    } else {
	set copyfile tmpdir/striprog
    }

    set osabi_fail "false"
    if [is_elf_format] {
	verbose -log "$READELF -a ${copyfile} > tmpdir/osabi.in"
	set exec_output [remote_exec host "$READELF -h ${copyfile}" "" "/dev/null" "tmpdir/osabi.in"]
	if { [lindex $exec_output 0] != 0 } then {
	    fail "$test1 preserving OS/ABI"
	    set osabi_fail "true"
	} else {
	    verbose -log "grep OS/ABI tmpdir/osabi.in"
	    catch "exec grep OS/ABI tmpdir/osabi.in" osabi_in
	}
     }

    set exec_output [binutils_run $prog "$flags ${copyfile}"]
    if ![string equal "" $exec_output] {
	fail $test1
	if [string equal "" $test2] {
	    return
	}
	fail $test2
	return
    }

    if [is_remote host] {
	remote_upload host ${copyfile} tmpdir/striprog
    }

    if { $osabi_fail != "true" && [is_elf_format] } {
	verbose -log "$READELF -a ${copyfile} > tmpdir/osabi.out"
	set exec_output [remote_exec host "$READELF -h ${copyfile}" "" "/dev/null" "tmpdir/osabi.out"]
	if { [lindex $exec_output 0] != 0 } then {
	    fail "$test1 preserving OS/ABI"
	} else {
	    verbose -log "grep OS/ABI tmpdir/osabi.out"
	    catch "exec grep OS/ABI tmpdir/osabi.out" osabi_out
	    if { "$osabi_in" == "$osabi_out" } {
		pass "$test1 preserving OS/ABI"
	    } else {
		fail "$test1 preserving OS/ABI"
	    }
	}
    }

    set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
    if ![string match "*: no symbols*" $exec_output] {
	fail $test1
	return
    }

    if [string equal "" $test2] {
	return
    }

    set result [remote_load target tmpdir/striprog]
    set status [lindex $result 0]
    if { $status != "pass" } {
	fail $test2
        return
    }

    pass $test2
}

# Test stripping an executable with saving a symbol

proc strip_executable_with_saving_a_symbol { prog flags test1 test2 } {
    global NM
    global NMFLAGS

    remote_file build delete tmpdir/striprog
    remote_download build tmpdir/copyprog tmpdir/striprog
    if [is_remote host] {
	set copyfile [remote_download host tmpdir/striprog]
    } else {
	set copyfile tmpdir/striprog
    }

    set exec_output [binutils_run $prog "$flags ${copyfile}"]
    if ![string equal "" $exec_output] {
	fail $test1
	if [string equal "" $test2] {
	    return
	}
	fail $test2
	return
    }

    set exec_output [binutils_run $NM "$NMFLAGS ${copyfile}"]
    if { [istarget mmix-knuth-mmixware] } {
	# Whenever there's a symbol in the mmo format, there's the symbol
	# Main, so remove it manually from the expected output for sake of
	# this test.

	# Using "" not {} to get the \n and \r translated.
	regsub "^\[0-9a-fA-F\]+\[ \]+T Main\[\n\r\]+" $exec_output "" exec_output
    }

    if {![regexp {^([0-9a-fA-F]+)?[ ]+[TtDd] _?main} $exec_output]} {
	fail $test1
	return
    }

    if [string equal "" $test2] {
	return
    }

    if [is_remote host] {
	remote_upload host ${copyfile} tmpdir/striprog
    }

    set result [remote_load target tmpdir/striprog]
    set status [lindex $result 0]
    if { $status != "pass" } {
	fail $test2
        return
    }

    pass $test2
}

# Test keeping only debug symbols of an executable

proc keep_debug_symbols_and_test_copy { prog1 flags1 test1 prog2 flags2 test2 } {
    remote_file build delete tmpdir/striprog
    remote_download build tmpdir/copyprog tmpdir/striprog
    if [is_remote host] {
	set copyfile [remote_download host tmpdir/striprog]
    } else {
	set copyfile tmpdir/striprog
    }

    set exec_output [binutils_run $prog1 "$flags1 ${copyfile}"]
    if ![string equal "" $exec_output] {
	fail $test1
	return
    }
    pass $test1

    set exec_output [binutils_run $prog2 "$flags2 ${copyfile}"]
    if ![string equal "" $exec_output] {
	fail $test2
	return
    }
    pass $test2
}

# Tests that in a debug only copy of a file the sections
# headers whose types have been changed to NOBITS still
# retain their sh_link fields.

proc keep_debug_symbols_and_check_links { prog flags test } {
    global READELF

    remote_file build delete tmpdir/striprog
    remote_download build tmpdir/copyprog tmpdir/striprog
    if [is_remote host] {
	set copyfile [remote_download host tmpdir/striprog]
    } else {
	set copyfile tmpdir/striprog
    }

    set exec_output [binutils_run $prog "$flags ${copyfile}"]
    if ![string equal "" $exec_output] {
	fail $test
	return
    }

    set got [binutils_run $READELF "-S --wide ${copyfile}"]

    set fails 0
    # Regexp to match a section with NOBITS type and extract its name and sh_link fields
    while {[regexp \
		{[^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]+)(.*)} \
		$got all name link rest]} {
	set sh_link 0x$link
	if {$sh_link == 0} {
	    # Only some NOBITS sections should have a non-zero sh_link field.
	    # Look for them by name.
	    verbose "NOBITS section .$name has a 0 sh_link field\n"
	    switch $name {
		"rela.*"	{ set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
		"rel.*"		{ set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
		"hash"		{ set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
		"gnu_version"	{ set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
		"dynsym"	{ set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
		"gnu.version_r"	{ set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
		"dynamic"	{ set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
		"symtab"	{ set fails 1 ; send_log "Expected non-zero sh_link for .$name\n" }
	    }
	}
	set got $rest
    }

    if {$fails == 0} {
	pass $test
    } else {
	fail $test
    }
}

# For ELF relocatables, test that --only-keep-debug
# marks non-debug output sections as NOBITS.

proc keep_debug_symbols_for_elf_relocatable { prog flags test } {
    global srcdir
    global subdir
    global READELF

    if { [target_compile $srcdir/$subdir/testprog.c tmpdir/testprog.o object debug] != "" } {
	untested $test
	return
    }

    if [is_remote host] {
	set relocatable [remote_download host tmpdir/testprog.o]
    } else {
	set relocatable tmpdir/testprog.o
    }

    set non_debug_sections {}
    set got [binutils_run $READELF "-S --wide ${relocatable}"]
    while { [regexp \
	    {[^a-zA-Z]+([a-zA-Z0-9_\.]+)[ \t]+([A-Z]+)[ \t]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ [0-9]+[ \t]+([A-Z]*)[ \t]+[0-9]+(.*)} \
	    $got all name type flag rest] } {
	if { $type != "NOTE" && [regexp {[AG]} $flag] } {
	    # PR 30699: Some debug sections can be in a group, so
	    # exclude sections whose name includes "debug_"
	    if { ! [regexp {debug_} $name] } {
		lappend non_debug_sections $name
	    }
	}
	set got $rest
    }

    set exec_output [binutils_run $prog "$flags ${relocatable}"]
    if ![string equal "" $exec_output] {
	fail $test
	return
    }

    set fails 0
    set got [binutils_run $READELF "-S --wide ${relocatable}"]
    while { [regexp \
	    {[^a-zA-Z]+([a-zA-Z0-9_\.]+)[ \t]+([A-Z]+)[ \t]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ [0-9]+[ \t]+[A-Z]*[ \t]+[0-9]+(.*)} \
	    $got all name type rest] } {
	if { [lsearch -exact $non_debug_sections $name] >= 0 && $type != "NOBITS" } {
	    set fails 1
	    send_log "Expected SHT_NOBITS type for .$name\n"
	}
	set got $rest
    }
    if { $fails == 1 } {
	fail $test
	return
    }

    pass $test
}

set test1 "simple objcopy of executable"
set test1r "run objcopy of executable"
set test2 "strip executable"
set test2r "run stripped executable"
set test3 "strip executable with saving a symbol"
set test3r "run stripped executable with saving a symbol"
set test4 "keep only debug data"
set test5 "simple objcopy of debug data"
if [is_elf_format] {
    set test6 "NOBITS sections retain sh_link field"
    set test7 "--only-keep-debug for ELF relocatables"
}

switch [copy_setup] {
    "1" {
	# do nothing
    }
    "2" {
	untested $test1
	untested $test1r
	untested $test2
	untested $test2r
	untested $test3
	untested $test3r
	untested $test4
	untested $test5
	if [is_elf_format] {
	    untested $test6
	    untested $test7
	}
    }
    "3" {
	copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" ""
	unsupported $test1r
	strip_executable "$STRIP" "$STRIPFLAGS" "$test2" ""
	unsupported $test2r
	strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test3" ""
	unsupported $test3r
	keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test4" \
					 "$OBJCOPY" "$OBJCOPYFLAGS" "$test5"
	if [is_elf_format] {
	    keep_debug_symbols_and_check_links "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test6"
	    keep_debug_symbols_for_elf_relocatable "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test7"
	}
    }
    "0" {
	copy_executable "$OBJCOPY" "$OBJCOPYFLAGS" "$test1" "$test1r"
	strip_executable "$STRIP" "$STRIPFLAGS" "$test2" "$test2r"
	strip_executable_with_saving_a_symbol "$STRIP" "-K main -K _main $STRIPFLAGS" "$test3" "$test3r"
	keep_debug_symbols_and_test_copy "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test4" \
					 "$OBJCOPY" "$OBJCOPYFLAGS" "$test5"
	if [is_elf_format] {
	    keep_debug_symbols_and_check_links "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test6"
	    keep_debug_symbols_for_elf_relocatable "$STRIP" "--only-keep-debug $STRIPFLAGS" "$test7"
	}
    }
}

proc objcopy_test_readelf {testname srcfile} {
    global OBJCOPY
    global OBJCOPYFLAGS
    global READELF
    global srcdir
    global subdir

    if {![binutils_assemble $srcdir/$subdir/${srcfile} tmpdir/bintest.o]} then {
	unsupported "objcopy ($testname)"
	return
    }

    verbose -log "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"
    set exec_output [remote_exec host "$OBJCOPY $OBJCOPYFLAGS tmpdir/bintest.o tmpdir/copy.o"]
    if { [lindex $exec_output 0] != 0
	 || ![string equal "" [lindex $exec_output 1]] } then {
	fail "objcopy ($testname)"
	return
    }

    verbose -log "$READELF -a tmpdir/bintest.o > tmpdir/bintest.o.out"
    set exec_output [remote_exec host "$READELF -a tmpdir/bintest.o" "" "/dev/null" "tmpdir/bintest.o.out"]
    if { [lindex $exec_output 0] != 0 } then {
	fail "objcopy ($testname)"
	return
    }
    set exec_output [prune_warnings [lindex $exec_output 1]]
    if ![string equal "" $exec_output] then {
	unresolved "objcopy ($testname)"
	return
    }

    verbose -log "$READELF -a tmpdir/copy.o > tmpdir/copy.o.out"
    set exec_output [remote_exec host "$READELF -a tmpdir/copy.o" "" "/dev/null" "tmpdir/copy.o.out"]
    if { [lindex $exec_output 0] != 0 } then {
	fail "objcopy ($testname)"
	return
    }
    set exec_output [prune_warnings [lindex $exec_output 1]]
    if ![string equal "" $exec_output] then {
	unresolved "objcopy ($testname)"
	return
    }

    verbose -log "diff tmpdir/bintest.o.out tmpdir/copy.o.out"
    catch "exec diff tmpdir/bintest.o.out tmpdir/copy.o.out" exec_output
    set exec_output [prune_warnings $exec_output]

    if [string equal "" $exec_output] then {
	pass "objcopy ($testname)"
    } else {
	fail "objcopy ($testname)"
    }
}

proc objcopy_test_symbol_manipulation {} {
    global srcdir
    global subdir

    set test_list [lsort [glob -nocomplain $srcdir/$subdir/symbols-*.d]]
    foreach t $test_list {
        # We need to strip the ".d", but can leave the dirname.
        verbose [file rootname $t]
        run_dump_test [file rootname $t]
    }

    if { [supports_gnu_unique] } {
	run_dump_test "weaken-gnu-unique"
    }
}

proc objcopy_test_elf_common_symbols {} {
    global srcdir
    global subdir

    # hpux has a non-standard common directive.
    if { [istarget "*-*-hpux*"] } then {
	return
    }

    set test_list [lsort [glob -nocomplain $srcdir/$subdir/common-*.d]]
    foreach t $test_list {
        # We need to strip the ".d", but can leave the dirname.
        verbose [file rootname $t]
        run_dump_test [file rootname $t]
    }
}

# ia64 specific tests
if { ([istarget "ia64-*-elf*"]
       || [istarget "ia64-*-linux*"]) } {
    objcopy_test "ia64 link order" link-order.s object "-x" ""
}

# ELF specific tests
set elf64 ""
if [is_elf_format] {
    objcopy_test_symbol_manipulation
    objcopy_test_elf_common_symbols
    objcopy_test "ELF unknown section type" unknown.s object "" ""
    objcopy_test_readelf "ELF group 1" group.s
    objcopy_test_readelf "ELF group 2" group-2.s
    objcopy_test_readelf "ELF group 3" group-3.s
    objcopy_test_readelf "ELF group 4" group-4.s
    objcopy_test_readelf "GNU_MBIND section" mbind1.s
    run_dump_test "group-5"
    run_dump_test "group-6"
    run_dump_test "group-7a"
    run_dump_test "group-7b"
    run_dump_test "group-7c"
    run_dump_test "copy-1"
    run_dump_test "copy-7"
    run_dump_test "note-1"
    # Use copytest.o from the note-1 test to determine ELF32 or ELF64
    if [is_elf64 tmpdir/copytest.o] {
	set elf64 "--defsym ELF64=1"
	run_dump_test "note-2-64"
	run_dump_test "note-3-64"
	run_dump_test "note-4-64"
	run_dump_test "note-6-64"
    } else {
	run_dump_test "note-2-32"
	run_dump_test "note-3-32"
	run_dump_test "note-4-32"
	run_dump_test "note-6-32"
    }
    run_dump_test "note-5"
    run_dump_test "object-attr-v2"
}

run_dump_test "copy-2"
run_dump_test "copy-3"
run_dump_test "copy-4"
run_dump_test "copy-5"
run_dump_test "copy-6"

# Use bintest.o from the copy-4 test to determine ELF reloc type
set reloc_format rel
if { [is_elf_format] && [is_rela tmpdir/bintest.o] } {
    set reloc_format rela
}
run_dump_test "pr19020a"
run_dump_test "pr19020b"

if [is_elf_format] {
    run_dump_test "strip-1"
    run_dump_test "strip-2"
    run_dump_test "strip-3"
    run_dump_test "strip-4"
    run_dump_test "strip-5"
    run_dump_test "strip-6"
    run_dump_test "strip-7"
    run_dump_test "strip-8"
    run_dump_test "strip-9"
    # This requires STB_GNU_UNIQUE support with OSABI set to GNU.
    if { [supports_gnu_unique] } {
	run_dump_test "strip-10"
    }
    run_dump_test "strip-11"
    run_dump_test "strip-12"

    if { [istarget "mips64*-*-openbsd*"] \
	 || [istarget "mips64*-*-*-gnuabi64"] } {
	set reloc_format mips64
    }
    # A relocation type not supported by any target
    if { [istarget "nds32*-*"] } {
	set reloc 255
    } else {
	set reloc 215
    }
    run_dump_test "strip-13" [list \
				  [list source strip-13${reloc_format}.s] \
				  [list as "${elf64} --defsym RELOC=${reloc}"]]
    # Select a relocation number that corresponds to one actually
    # supported by the target and ABI being tested.
    if { [istarget "aarch64*-*"] } {
	set reloc 259
    } elseif { [istarget "ia64*-*"] \
	       || [istarget "m32r*-*"] \
	       || [istarget "nds32*-*"] \
	       || [istarget "v850*-*"] } {
	set reloc 50
    } elseif { [istarget "pru-*"] } {
	set reloc 11
    } else {
	set reloc 1
    }
    run_dump_test "strip-14" [list \
				  [list source strip-14${reloc_format}.s] \
				  [list as "${elf64} --defsym RELOC=${reloc}"]]
    run_dump_test "strip-15" [list \
				  [list source strip-15${reloc_format}.s] \
				  [list as "${elf64} --defsym RELOC=${reloc}"]]
    run_dump_test "strip-16"

    if { [istarget "i*86-*"] || [istarget "x86_64-*-*"] } {
	# Check to make sure we don't strip a symbol named in relocations.
	set test "objcopy keeps symbols needed by relocs"

	set srcfile $srcdir/$subdir/needed-by-reloc.s

	if {![binutils_assemble $srcfile tmpdir/bintest.o]} then {
	    unsupported $test
	} else {
	    set got [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-symbol=foo tmpdir/bintest.o ${copyfile}.o"]

	    if [regexp "not stripping symbol `foo' because it is named in a relocation" $got] {
		pass $test
	    } else {
		fail $test
	    }
	}
    }

    # The symbol table for some MIPS targets is sorted differently than
    # the ELF canonical order, so the regexps in localize-hidden-1.d fail
    # to match.
    if { [is_bad_symtab] } then {
	setup_xfail "*-*-*"
    }
    run_dump_test "localize-hidden-1"
    run_dump_test "testranges"
    run_dump_test "testranges-ia64"

    run_dump_test "add-section"
    run_dump_test "add-symbol"
    run_dump_test "add-empty-section"

    run_dump_test "exclude-1a"
    run_dump_test "exclude-1b"

    run_dump_test "only-section-01"
    run_dump_test "remove-section-01"

    run_dump_test "keep-section-1"
    run_dump_test "keep-section-2"

    # Test the remove relocation functionality
    set test_list [lsort [glob -nocomplain $srcdir/$subdir/remove-relocs-*.d]]
    foreach t $test_list {
        # We need to strip the ".d", but can leave the dirname.
        verbose [file rootname $t]
        run_dump_test [file rootname $t]
    }

    # Test --strip-section-headers
    run_dump_test "strip-section-headers-1" [list \
			  [list source strip-15${reloc_format}.s] \
			  [list as "${elf64} --defsym RELOC=${reloc}"]]
}
run_dump_test "localize-hidden-2"

# Test objcopying an object file without global symbol

proc objcopy_test_without_global_symbol { } {
    global OBJCOPY
    global OBJCOPYFLAGS
    global OBJDUMP
    global OBJDUMPFLAGS
    global srcdir
    global subdir
    global CFLAGS_FOR_TARGET

    set test "strip without global symbol "

    set opts "debug"
    if [string match "*-fsanitize=*" $CFLAGS_FOR_TARGET] {
	append opts " additional_flags=-fno-sanitize=all"
    }

    set objfile tmpdir/pr19547.o
    if { [target_compile $srcdir/$subdir/pr19547.c $objfile object $opts] != "" } {
	untested $test
	return
    }

    if [is_remote host] {
	set objfile [remote_download host $objfile]
    }

    set exec_output [binutils_run $OBJCOPY "$OBJCOPYFLAGS --strip-unneeded $objfile"]
    set exec_output [prune_warnings $exec_output]
    if ![string equal "" $exec_output] {
	fail $test
	return
    }

    set exec_output [binutils_run $OBJDUMP "$OBJDUMPFLAGS -t $objfile"]
    set exec_output [prune_warnings $exec_output]
    if {![regexp "no symbols" $exec_output]} {
	fail $test
	return
    }

    pass $test
}

# The AArch64 and ARM targets preserve mapping symbols
# in object files, so they will fail this test.
setup_xfail aarch64*-*-* arm*-*-*

objcopy_test_without_global_symbol

# objcopy remove relocation from executable test

proc objcopy_remove_relocations_from_executable { } {
    global OBJCOPY
    global srcdir
    global subdir
    global READELF

    set test "remove-section relocation sections"

    if { [target_compile $srcdir/$subdir/testprog.c tmpdir/pr23611 executable debug] != "" } {
	untested $test
	return
    }

    if [is_remote host] {
	set objfile [remote_download host tmpdir/pr23611]
    } else {
	set objfile tmpdir/pr23611
    }
    set out tmpdir/pr23611.out

    set exec_output1 [binutils_run $OBJCOPY "-R .rela.plt -R .rela.dyn -R .rel.plt -R .rel.dyn $objfile $out"]

    set exec_output1 [prune_warnings $exec_output1]
    if ![string equal "" $exec_output1] {
	fail $test
	return
    }

    set exec_output2 [binutils_run $READELF "-S $out"]
    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] } {
	fail $test
	return
    }
    pass $test
}

if [is_elf_format] {
    objcopy_remove_relocations_from_executable
}

run_dump_test "pr23633"

run_dump_test "set-section-alignment"

setup_xfail "hppa*-*-*"
setup_xfail "spu-*-*"
clear_xfail "hppa*64*-*-hpux*" "hppa*-*-linux*" "hppa*-*-lites*"
clear_xfail "hppa*-*-*n*bsd*" "hppa*-*-*elf*"
if { [istarget pdp11-*-*] } {
    set src "pr25662-pdp11.s"
} else {
    set src "pr25662.s"
}

set ldflags "-T$srcdir/$subdir/pr25662.ld"
if { [istarget *-*-cygwin] || [istarget *-*-mingw*] } {
   append ldflags " --disable-reloc-section"
}

#xcoff doesn't support arbitrary sections
if { ![is_xcoff_format] } {
    objcopy_test "pr25662" $src executable "" $ldflags
}

run_dump_test "rename-section-01"

proc objcopy_tek2bin {} {
    global OBJCOPY
    global OBJDUMP
    global srcdir
    global subdir

    set tek $srcdir/$subdir/tek2.obj
    set out tmpdir/tek2bin
    if [is_remote host] {
	set tek [remote_download host $tek]
	set out tek2bin
    }

    set got [binutils_run $OBJCOPY "-O binary $tek $out"]
    if ![string equal "" $got] then {
	send_log "$got\n"
	fail "objcopy tek2bin"
    } else {
	set got [binutils_run $OBJDUMP "-s -b binary $out"]
	if {![regexp ".* 0000 000031 .*" $got]} {
	    fail "objcopy tek2bin (objdump)"
	} else {
	    pass "objcopy tek2bin"
	}
    }
    remote_file host delete $out
}

objcopy_tek2bin

# Test objcopy -I binary and --binary-symbol-prefix

proc binary_symbol {name file args sym_prefix} {
    global OBJCOPY
    global NM
    global NMFLAGS
    global binutils_run_status

    set test "binary symbol ($name)"

    # detect a valid target, take the first supported
    set inf [split [binutils_run $OBJCOPY "--info"] \n]
    set target [lindex $inf 1]
    set arch [string trim [lindex $inf 3]]

    set out tmpdir/binary_${name}.o
    set got [binutils_run $OBJCOPY "-I binary -B $arch -O $target $args $file $out"]
    if { $binutils_run_status != 0 || ![string equal "" $got] } {
	fail $test
	return
    }

    set got [binutils_run $NM "-a $NMFLAGS $out"]
    if { $binutils_run_status != 0 } {
	fail $test
	return
    }

    set syms [list {D start} {D end} {A size}]
    foreach e $syms {
	set typ [lindex $e 0]
	set sym [lindex $e 1]
	set exp "^\[0-9a-fA-F\]+ +${typ} +${sym_prefix}_${sym}$"
	if ![regexp -line $exp $got] {
	    send_log "failed to match: $exp\n"
	    fail $test
	    return
	}
    }

    pass $test
}

binary_symbol implicit $srcdir/$subdir/version.s "" _binary_.*[regsub -all {[^0-9a-zA-Z]} $subdir/version.s _]
binary_symbol explicit $srcdir/$subdir/version.s "--binary-symbol-prefix symbol1" symbol1
