# Test handling of weak undefined symbols
#   Copyright 2001, 2002, 2004, 2005, 2007, 2010, 2011, 2012
#   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 *-*-nacl*] \
     && ![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 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
    }
}
