# Test weak symbols.
# By Ian Lance Taylor, Cygnus Solutions.
#   Copyright (C) 1999-2023 Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# 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.

set testname "weak symbols"

# This test only works for ELF targets and some PE targets.
# It ought to work for some a.out targets, but it doesn't.
if { [is_elf_format] } {
    # hppa64 is incredibly broken
    setup_xfail hppa64-*-*
} elseif { [is_pecoff_format] } {
    # Weak symbols are broken for most PE targets.
    if { ![istarget aarch64-*-*]
	 && ![istarget i?86-*-*]
	 && ![istarget sh-*-*]
	 && ![istarget x86_64-*-*] } {
	setup_xfail *-*-*
    }
} else {
    unsupported $testname
    return
}

if {! [ld_assemble $as $srcdir/$subdir/weak1.s tmpdir/weak1.o]
    || ! [ld_assemble $as $srcdir/$subdir/weak2.s tmpdir/weak2.o]} then {
    # It's OK if .weak doesn't work on this target.
    unsupported $testname
    return
}

set saved_LDFLAGS "$LDFLAGS"
if { [is_pecoff_format] } then {
    set LDFLAGS "$LDFLAGS --image-base 0"
}

set weak_regexp_big \
".*Contents of section .text:.*1000 00001008 0000200c 12121212 34343434.*Contents of section .data:.*2000 00001008 0000200c 56565656 78787878.*"

set weak_regexp_little \
".*Contents of section .text:.*1000 08100000 0c200000 12121212 34343434.*Contents of section .data:.*2000 08100000 0c200000 56565656 78787878.*"

if {! [ld_link $ld tmpdir/weak "$flags -T $srcdir/$subdir/weak.t tmpdir/weak1.o tmpdir/weak2.o"] } then {
    fail $testname
} else {
    set exec_output [run_host_cmd "$objdump" "-s tmpdir/weak"]
    set exec_output [prune_warnings $exec_output]
    verbose -log $exec_output

    if {[regexp $weak_regexp_big $exec_output] \
	|| [regexp $weak_regexp_little $exec_output] } then {
	pass $testname
    } else {
	fail $testname
    }
}

set LDFLAGS "$saved_LDFLAGS"
