# Test handling of weak undefined symbols
#   Copyright 2001, 2002, 2004, 2005, 2007, 2010
#   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 undefined symbols"

# This test only works for ELF targets.  It ought to work for some
# a.out targets, but it doesn't.

if { ![istarget *-*-sysv4*] \
     && ![istarget *-*-unixware*] \
     && ![istarget *-*-elf*] \
     && ![istarget *-*-eabi*] \
     && ![istarget hppa*64*-*-hpux*] \
     && ![istarget *-*-linux*] \
     && ![istarget *-*-gnu*] \
     && ![istarget *-*-irix5*] \
     && ![istarget *-*-irix6*] \
     && ![is_pecoff_format] \
     && ![istarget *-*-solaris2*] } then {
    unsupported $testname
    return
}

if { [istarget *-*-linux*aout*] \
     || [istarget *-*-linux*oldld*] } {
    unsupported $testname
    return
}

# Weak symbols are broken for non-i386 PE targets.
if {! [istarget i?86-*-*]} {
    setup_xfail *-*-pe*
}

setup_xfail hppa64-*-* pj-*-*

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

# The linker should accept references to undefined weaks without error,
# and resolve them to zero.

set output_regexp \
".*Contents of section .data:.*0000 00000000 11111111.*"

if {! [ld_simple_link $ld tmpdir/weak-undef "$flags tmpdir/weak-undef.o -T $srcdir/$subdir/weak-undef.t"] } then {
    fail $testname
} else {
    if {![is_remote host] && [which $objdump] == 0} then {
	unresolved $testname
	return
    }

    set exec_output [run_host_cmd "$objdump" "-s tmpdir/weak-undef"]
    set exec_output [prune_warnings $exec_output]
    verbose -log $exec_output

    if {[regexp $output_regexp $exec_output]} then {
	pass $testname
    } else {
	fail $testname
    }
}
