aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-undefined/undefined.exp
blob: 92393222ebfe122716cd7d980c59655453a44b92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# Test that the linker reports undefined symbol errors correctly.
# By Ian Lance Taylor, Cygnus Support
#
#   Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
#   Free Software Foundation, Inc.
#
# This file 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 2 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

set testund "undefined"
set testfn "undefined function"
set testline "undefined line"

if { [which $CC] == 0 } {
    verbose "Could not find C compiler!" 1
    untested $testund
    untested $testfn
    untested $testline
    return
}

if ![ld_compile "$CC -g" $srcdir/$subdir/undefined.c tmpdir/undefined.o] {
    verbose "Unable to compile test file!" 1
    unresolved $testund
    unresolved $testfn
    unresolved $testline
    return
}

catch "exec rm -f tmpdir/undefined" exec_output

set flags [big_or_little_endian]

# Using -e start prevents the SunOS linker from trying to build a
# shared library.
send_log "$ld -e start $flags -o tmpdir/undefined tmpdir/undefined.o\n"
verbose "$ld -e start $flags -o tmpdir/undefined tmpdir/undefined.o"

catch "exec $ld -e start $flags -o tmpdir/undefined tmpdir/undefined.o" exec_output
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 mu "undefined reference to `*this_function_is_not_defined'"
checkund $mu $testund

# ARM PE defaults to using stabs debugging, which we can't handle for
# a COFF file.
#setup_xfail "arm*-*-pe*"
#setup_xfail "thumb*-*-pe*"

# Just doesn't work for PA ELF.  No clue why.
setup_xfail "hppa*-*-*elf*"

set mf "tmpdir/undefined.o* In function `function':"
checkund $mf $testfn

if [is_elf_format] {
    
    # Just doesn't work for PA ELF.  No clue why.
    setup_xfail "hppa*-*-*"
    
} else {

    # COFF SH gets this test wrong--it reports line 10, because although
    # the jump is at line 9, the function address, and the reloc, is
    # stored at the end of the function.
    setup_xfail "sh-*-*"

    # ARM PE defaults to using stabs debugging, which we can't handle for
    # a COFF file.
    #setup_xfail "arm*-*-pe*"
    #setup_xfail "thumb*-*-pe*"
}

set ml "undefined.c:9: undefined reference to `*this_function_is_not_defined'"
# With targets that use elf/dwarf2, such as the arm-elf and thumb-elf
# toolchains, the code in bfd/elf.c:_bfd_elf_find_nearest_line() is called
# in order to locate the file name/line number where the undefined
# reference occurs.  Unfortunately this tries to use the dwarf2 debug
# information held in the .debug_info section.  This section contains a series
# of comp_unit structures, each of which has a low/high address range
# representing the span of memory locations covered by that structure.  The
# structures also index into other structures held in the .debug_line section
# and together they can translate memory locations back into file/function/line
# number addresses in the source code.  Since the information about the memory
# region covered by a comp_unit is only determined at link time, the low/high
# addresses in the .debug_info section and the line addresses in the .debug_line
# section are computed by generating relocs against known symbols in the object
# code.
#
# When the undefined reference is detected, the relocs in the dwarf2
# debug sections have not yet been resolved, so the low/high addresses and the
# line number address are all set at zero.  Thus when _bfd_elf_find_nearest_line()
# calls _bfd_dwarf2_find_nearest_line() no comp_unit can be found which
# actually covers the address where the reference occured, and so
# _bfd_elf_find_nearest_line() fails.
#
# The upshot of all of this, is that the error message reported by the
# linker, instead of having a source file name & line number as in:
#
#   undefined.c:9: undefined reference to `this_function_is_not_defined'
#
# has an object file & section address instead:
#
#   undefined.0(.text+0xc): undefined reference to `this_function_is_not_defined'
#
# hence the xfails below.

setup_xfail mcore-*-elf
setup_xfail mips-sgi-irix6*
setup_xfail "sh64-*-*"

# The undefined test fails on 31 bit s/390 because the address of the 
# function `this_function_is_not_defined' is stored in the literal pool of
# the function. Therefore the line number in the error message is 8 instead
# of 9. On 64 bit s/390 this works because of the new brasl instruction that
# doesn't need a literal pool entry.
setup_xfail s390-*-*

checkund $ml $testline