# Test that the linker reports undefined symbol line number correctly.
#
#   Copyright 2007  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.

if { !([istarget "x86_64-*-elf*"]
       || [istarget "x86_64-*-linux*"]) } {
    return
}

set testline "undefined line"

if ![ld_assemble $as "--64 $srcdir/$subdir/undefined.s" tmpdir/undefined.o] {
    verbose "Unable to assemble test file!" 1
    unresolved $testline
    return
}

remote_file host delete "tmpdir/undefined"

# Using -e start prevents the SunOS linker from trying to build a
# shared library.
send_log "$ld -e start -melf_x86_64 -o tmpdir/undefined tmpdir/undefined.o\n"
set exec_output [run_host_cmd "$ld" "-e start -melf_x86_64 -o tmpdir/undefined tmpdir/undefined.o"]

send_log "$exec_output\n"
verbose "$exec_output"

proc checkund { string testname } {
    global exec_output

    if [string match "*$string*" $exec_output] {
	pass $testname
    } else {
	fail $testname
    }
}

set ml "undefined.c:9: undefined reference to `*this_function_is_not_defined'"

checkund $ml $testline
