# Test EXTERN in a linker script.
# By Nathan Sidwell, CodeSourcery LLC
#   Copyright (C) 2007-2016 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 "EXTERN"

if ![ld_assemble $as $srcdir/$subdir/extern.s tmpdir/extern.o] {
    unresolved $testname
    return
}

if ![ld_simple_link $ld tmpdir/extern "-T $srcdir/$subdir/extern.t tmpdir/extern.o"] {
    fail $testname
}

if ![ld_nm $nm "" tmpdir/extern] {
    unresolved $testname
    return
}

if {![info exists nm_output(sym1)] || $nm_output(sym1) != 1} {
    send_log "sym1 wrong\n"
    verbose "sym1 wrong"
    fail $testname
    return
}
    
if {![info exists nm_output(sym2)] || $nm_output(sym2) != 2} {
    send_log "sym1 wrong\n"
    verbose "sym1 wrong"
    fail $testname
    return
}
if {![info exists nm_output(sym3)] || $nm_output(sym3) != 3} {
    send_log "sym1 wrong\n"
    verbose "sym1 wrong"
    fail $testname
    return
}
if {![info exists nm_output(sym4)] || $nm_output(sym4) != 4} {
    send_log "sym1 wrong\n"
    verbose "sym1 wrong"
    fail $testname
    return
}
if {![info exists nm_output(sym5)] || $nm_output(sym5) != 5} {
    send_log "sym1 wrong\n"
    verbose "sym1 wrong"
    fail $testname
    return
}

pass $testname
