]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - ld/testsuite/ld-undefined/undefined.exp
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / ld / testsuite / ld-undefined / undefined.exp
index e80be032f0b0830c89fab234cb913d32ed56842d..4480dfc8ebbb136b321ab17c72d3752272f91ee0 100644 (file)
@@ -1,8 +1,7 @@
 # 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,
-#   2005, 2007, 2008  Free Software Foundation, Inc.
+#   Copyright (C) 1995-2021 Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
 #
@@ -25,120 +24,211 @@ set testund "undefined"
 set testfn "undefined function"
 set testline "undefined line"
 
-if { ![is_remote host] && [which $CC] == 0 } {
+if { ![check_compiler_available] } {
     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] {
+} elseif { ![ld_compile "$CC -g $NOLTO_CFLAGS" $srcdir/$subdir/undefined.c tmpdir/undefined.o] } {
     verbose "Unable to compile test file!" 1
     unresolved $testund
     unresolved $testfn
     unresolved $testline
-    return
-}
+} else {
+    remote_file host delete "tmpdir/undefined"
 
-remote_file host delete "tmpdir/undefined"
+    set flags [big_or_little_endian]
 
-set flags [big_or_little_endian]
+    # Using -e start prevents the SunOS linker from trying to build a
+    # shared library.  But don't use an entry point in BPF targets.
+    switch -glob $target_triplet {
+        bpf-*-* { set entry "" }
+        * { set entry "-e start" }
+    }
 
-# 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"
-set exec_output [run_host_cmd "$ld" "-e start $flags -o tmpdir/undefined tmpdir/undefined.o"]
+    send_log "$ld $entry $flags -o tmpdir/undefined tmpdir/undefined.o\n"
+    set exec_output [run_host_cmd "$ld" "$entry $flags -o tmpdir/undefined tmpdir/undefined.o"]
 
-send_log "$exec_output\n"
-verbose "$exec_output"
+    send_log "$exec_output\n"
+    verbose "$exec_output"
 
-proc checkund { string testname } {
-    global exec_output
+    proc checkund { string testname } {
+       global exec_output
 
-    if [string match "*$string*" $exec_output] {
-       pass $testname
-    } else {
-       fail $testname
+       if [string match "*$string*" $exec_output] {
+           pass $testname
+       } else {
+           fail $testname
+       }
     }
-}
 
-set mu "undefined reference to `*this_function_is_not_defined'"
-checkund $mu $testund
+    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*"
-
-# For Xtensa on GNU Linux systems (or any other system where PIC code is
-# always used), the address of the undefined function is in a literal pool
-# outside the function, so that both the "undefined function" and "undefined
-# line" tests fail.
-setup_xfail xtensa*-*-linux*
+    # ARM PE defaults to using stabs debugging, which we can't handle
+    # for a COFF file.
+    #setup_xfail "arm*-*-pe*"
 
-set mf "tmpdir/undefined.o* In function `function':"
-checkund $mf $testfn
+    # For Xtensa on GNU Linux systems (or any other system where PIC
+    # code is always used), the address of the undefined function is
+    # in a literal pool outside the function, so that both the
+    # "undefined function" and "undefined line" tests fail.
+    setup_xfail xtensa*-*-linux*
 
-if ![is_elf_format] {
-    # 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-*-*"
+    set mf "tmpdir/undefined.o* in function `function':"
+    checkund $mf $testfn
 
-    # ARM PE defaults to using stabs debugging, which we can't handle for
-    # a COFF file.
-    #setup_xfail "arm*-*-pe*"
-    #setup_xfail "thumb*-*-pe*"
-}
+    if ![is_elf_format] {
+       # 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-*-*"
 
-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.
+       # ARM PE defaults to using stabs debugging, which we can't
+       # handle for a COFF file.
+       #setup_xfail "arm*-*-pe*"
+    }
 
-setup_xfail mcore-*-elf
-setup_xfail mep-*-*
-setup_xfail mips-sgi-irix6*
-setup_xfail "sh64-*-*"
+    set ml "undefined.c:9: undefined reference to `*this_function_is_not_defined'"
+    # With targets that use elf/dwarf2, such as the arm-elf toolchain,
+    # 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 occurred, 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 mep-*-*
+    setup_xfail mips-sgi-irix6*
+    # Fails for the MSP430 because it uses SYM_DIFF relocs but it does
+    # not provide a special_function for handling them.  If
+    # optimization is enabled then this test passes because
+    # function()'s prologue is eliminated.
+    setup_xfail "msp430-*-*"
+
+    # 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-*-*
+
+    # See comments above for Xtensa.
+    setup_xfail xtensa*-*-linux*
+    setup_xfail hppa*64*-*-*
+
+    # eBPF doesn't support dwarf yet.
+    setup_xfail bpf-*-*
+
+    checkund $ml $testline
+}
 
-# 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-*-*
+# Undefined symbols should become dynamic when linking a shared lib.
+set testname "undefined symbols in shared lib"
+
+set asflags ""
+switch -glob $target_triplet {
+    aarch64* -
+    arm* -
+    powerpc64* { set asflags "--defsym BL=1" }
+    powerpc* { set asflags "--defsym BLPLT=1" }
+    hppa* { set asflags "--defsym HPPA=1" }
+    i\[3-7\]86* -
+    x86_64* { set asflags "--defsym CALLPLT=1" }
+}
 
-# See comments above for Xtensa.
-setup_xfail xtensa*-*-linux*
+if { ![is_elf_format] || ![check_shared_lib_support]} then {
+    unsupported $testname
+} elseif {![ld_assemble $as "$asflags $srcdir/$subdir/fundef.s" \
+               tmpdir/fundef.o]} then {
+    fail $testname
+} elseif {![ld_link $ld tmpdir/fundef.so \
+               "-shared --allow-shlib-undefined tmpdir/fundef.o"]} then {
+    setup_xfail tic6x-*-*
+    fail $testname
+} else {
+    if {![is_remote host] && [which $nm] == 0} then {
+       unresolved "$testname (dyn sym)"
+    } else {
+       set exec_output [run_host_cmd "$nm" "-D tmpdir/fundef.so"]
+       set exec_output [prune_warnings $exec_output]
+
+       if { ($asflags == ""
+             || ([regexp ".* undef_fun_typed.*" $exec_output]
+                 && [regexp ".* undef_fun_notype.*" $exec_output]))
+            && [regexp ".* undef_data.*" $exec_output]
+            && [regexp ".* undef_pfun.*" $exec_output]
+            && [regexp ".* undef_notype.*" $exec_output]} then {
+           pass "$testname (dyn sym)"
+       } else {
+           fail "$testname (dyn sym)"
+       }
+    }
 
-checkund $ml $testline
+    global READELF
+    if {![is_remote host] && [which $READELF] == 0} then {
+       unresolved "$testname (dyn reloc)"
+    } else {
+       set exec_output [run_host_cmd "$READELF" "-r tmpdir/fundef.so"]
+       set exec_output [prune_warnings $exec_output]
+
+       # We ought to get two .rel{a}.plt and three .rel{a}.dyn relocs,
+       # except for MIPS targets whose psABI mandates an extra
+       # R_MIPS_NONE relocation, also used to pad n64 relocation
+       # triplets, and S+core targets using an extra R_SCORE_NONE
+       # relocation, so adjust for that.
+       switch -glob $target_triplet {
+           "mips64*-*-openbsd*" {
+               set none_count 6
+               set reloc_count 4
+           }
+           "mips*" -
+           "score*" {
+               set none_count 1
+               set reloc_count 4
+           }
+           "*" {
+               set none_count 0
+               set reloc_count 3
+           }
+       }
+
+       if { ($asflags == "" || [regexp ".* contains 2 .*" $exec_output])
+            && [regexp ".* contains $reloc_count .*" $exec_output]
+            && [regexp -all "_NONE" $exec_output] == $none_count } then {
+           pass "$testname (dyn reloc)"
+       } else {
+           fail "$testname (dyn reloc)"
+       }
+    }
+}