X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Ftestsuite%2Fld-ifunc%2Fifunc.exp;h=d7ff445c3628c0188020112ead01273a8efc205f;hb=4584ec12076e088cf36965b88ef8710ca85491f9;hp=d7219f813a93948f3018e4b1a5d912c7400e60c4;hpb=552deff83171bdf238eacd1cc2798ca8bc849093;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp index d7219f813a..d7ff445c36 100644 --- a/ld/testsuite/ld-ifunc/ifunc.exp +++ b/ld/testsuite/ld-ifunc/ifunc.exp @@ -1,6 +1,6 @@ # Expect script for linker support of IFUNC symbols and relocations. # -# Copyright 2009 Free Software Foundation, Inc. +# Copyright 2009, 2010, 2012 Free Software Foundation, Inc. # Contributed by Red Hat. # # This file is part of the GNU Binutils. @@ -23,13 +23,17 @@ # Written by Nick Clifton -# IFUNC support has only been implemented for the ix86, x86_64 and powerpc -# so far. +# IFUNC support has only been implemented for the ix86, x86_64, powerpc, +# aarch64 and sparc so far. if {!(([istarget "i?86-*-*"] || [istarget "x86_64-*-*"] - || [istarget "powerpc*-*-*"]) + || [istarget "powerpc*-*-*"] + || [istarget "aarch64*-*-*"] + || [istarget "sparc*-*-*"]) && ([istarget "*-*-elf*"] - || ([istarget "*-*-linux*"] + || [istarget "*-*-nacl*"] + || (([istarget "*-*-linux*"] + || [istarget "*-*-gnu*"]) && ![istarget "*-*-*aout*"] && ![istarget "*-*-*oldld*"]))) } { verbose "IFUNC tests not run - target does not support IFUNC" @@ -75,7 +79,7 @@ proc check_osabi { binary_file expected_osabi } { } verbose "Expected OSABI: $expected_osabi, Obtained osabi: $osabi" - + return 0 } @@ -94,8 +98,9 @@ proc contains_ifunc_symbol { binary_file } { # Look for a line like this: # 58: 0000000000400600 30 IFUNC GLOBAL DEFAULT 12 library_func2 + # with perhaps some other info between the visibility and section - if { ![regexp ".*\[ \]*IFUNC\[ \]+GLOBAL\[ \]+DEFAULT\[ \]+\[UND0-9\]+\[ \]+library_func2\n" [file_contents readelf.out]] } { + if { ![regexp ".*\[ \]*IFUNC\[ \]+GLOBAL\[ \]+DEFAULT .* \[UND0-9\]+\[ \]+library_func2\n" [file_contents readelf.out]] } { return 0 } @@ -122,7 +127,7 @@ proc contains_irelative_reloc { binary_file } { # 080496f4 0000002a R_386_IRELATIVE - if { ![regexp "\[0-9a-f\]+\[ \]+\[0-9a-f\]+\[ \]+R_\[_0-9A-Z\]+_IRELATIVE\[ \]*\[0-9a-f\]*\n" [file_contents readelf.out]] } { + if { ![regexp "\[0-9a-f\]+\[ \]+\[0-9a-f\]+\[ \]+R_\[_0-9A-Z\]+_IREL(|ATIVE)\[ \]*\[0-9a-f\]*\n" [file_contents readelf.out]] } { return 0 } @@ -157,24 +162,36 @@ proc contains_ifunc_reloc { binary_file } { set fails 0 # Create the object files, libraries and executables. -if ![ld_compile "$CC -c -shared -fPIC" "$srcdir/$subdir/prog.c" "tmpdir/shared_prog.o"] { - fail "Could not create a shared object file" +if ![ld_compile "$CC -c -fPIC" "$srcdir/$subdir/prog.c" "tmpdir/shared_prog.o"] { + fail "Could not create a PIC object file" + set fails [expr $fails + 1] +} +if ![ld_compile "$CC -c" "$srcdir/$subdir/prog.c" "tmpdir/static_prog.o"] { + fail "Could not create a non-PIC object file" + set fails [expr $fails + 1] +} +if ![ld_compile "$CC -c -fPIC -DWITH_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/shared_ifunc.o"] { + fail "Could not create a PIC object file containing an IFUNC symbol" set fails [expr $fails + 1] } -if ![ld_compile "$CC -c -static" "$srcdir/$subdir/prog.c" "tmpdir/static_prog.o"] { - fail "Could not create a static object file" +if ![ld_compile "$CC -c -DWITH_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/static_ifunc.o"] { + fail "Could not create a non-PIC object file containing an IFUNC symbol" set fails [expr $fails + 1] } -if ![ld_compile "$CC -c -shared -fPIC -DWITH_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/shared_ifunc.o"] { - fail "Could not create an object file containing an IFUNC symbol" +if ![ld_compile "$CC -c -DWITHOUT_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/static_noifunc.o"] { + fail "Could not create an ordinary non-PIC object file" set fails [expr $fails + 1] } -if ![ld_compile "$CC -c -static -DWITH_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/static_ifunc.o"] { - fail "Could not create a static object file containing an IFUNC symbol" +if ![ld_assemble $as "$srcdir/ld-elf/empty.s" "tmpdir/empty.o"] { + fail "Could not create an empty object file" set fails [expr $fails + 1] } -if ![ld_compile "$CC -c -static -DWITHOUT_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/static_noifunc.o"] { - fail "Could not create an ordinary static object file" +if ![ld_compile "$CC -c" "$srcdir/$subdir/test-1.c" "tmpdir/test-1.o"] { + fail "Could not create test-1.o" + set fails [expr $fails + 1] +} +if ![ld_compile "$CC -fPIC -c" "$srcdir/$subdir/test-2.c" "tmpdir/test-2.o"] { + fail "Could not create test-2.o" set fails [expr $fails + 1] } @@ -207,10 +224,18 @@ if ![default_ld_link $ld "tmpdir/static_prog" "-static -Ltmpdir tmpdir/static_pr fail "Could not link a static executable" set fails [expr $fails + 1] } -if ![default_ld_link $ld "tmpdir/static_nonifunc_prog" "-static -Ltmpdir tmpdir/static_prog.o tmpdir/static_noifunc.o"] { +if ![ld_simple_link $ld "tmpdir/static_nonifunc_prog" "-static tmpdir/empty.o"] { fail "Could not link a non-ifunc using static executable" set fails [expr $fails + 1] } +if ![default_ld_link $ld "tmpdir/test-1" "tmpdir/test-1.o tmpdir/libshared_ifunc.so"] { + fail "Could not link test-1" + set fails [expr $fails + 1] +} +if ![ld_simple_link $ld "tmpdir/libtest-2.so" "-shared tmpdir/test-2.o"] { + fail "Could not link libtest-2.so" + set fails [expr $fails + 1] +} if { $fails == 0 } { pass "Building ifunc binaries" @@ -222,30 +247,29 @@ if { $fails == 0 } { # Check the executables and shared libraries # # The linked ifunc using executables and the shared library containing -# ifunc should have an OSABI field of LINUX. The linked non-ifunc using +# ifunc should have an OSABI field of GNU. The linked non-ifunc using # executable should have an OSABI field of NONE (aka System V). -if {! [check_osabi tmpdir/libshared_ifunc.so {UNIX - Linux}]} { - fail "Shared libraries containing ifunc does not have an OS/ABI field of LINUX" +if {! [check_osabi tmpdir/libshared_ifunc.so {UNIX - GNU}]} { + fail "Shared libraries containing ifunc does not have an OS/ABI field of GNU" set fails [expr $fails + 1] } -if {! [check_osabi tmpdir/local_prog {UNIX - Linux}]} { - fail "Local ifunc-using executable does not have an OS/ABI field of LINUX" +if {! [check_osabi tmpdir/local_prog {UNIX - GNU}]} { + fail "Local ifunc-using executable does not have an OS/ABI field of GNU" set fails [expr $fails + 1] } -if {! [check_osabi tmpdir/static_prog {UNIX - Linux}]} { - fail "Static ifunc-using executable does not have an OS/ABI field of LINUX" +if {! [check_osabi tmpdir/static_prog {UNIX - GNU}]} { + fail "Static ifunc-using executable does not have an OS/ABI field of GNU" set fails [expr $fails + 1] } -if {! [check_osabi tmpdir/dynamic_prog {UNIX - Linux}]} { - fail "Dynamic ifunc-using executable does not have an OS/ABI field of LINUX" +if {! [check_osabi tmpdir/dynamic_prog {UNIX - System V}]} { + fail "Dynamic ifunc-using executable does not have an OS/ABI field of System V" + set fails [expr $fails + 1] +} +if {! [check_osabi tmpdir/static_nonifunc_prog {UNIX - System V}]} { + fail "Static non-ifunc-using executable does not have an OS/ABI field of System V" set fails [expr $fails + 1] } -# FIXME: This test will fail if libc.a has ifunc functons. -#if {! [check_osabi tmpdir/static_nonifunc_prog {UNIX - System V}]} { -# fail "Static non-ifunc-using executable does not have an OS/ABI field of System V" -# set fails [expr $fails + 1] -#} # The linked ifunc using executables and the shared library containing # ifunc should contain an IFUNC symbol. The non-ifunc using executable @@ -263,14 +287,22 @@ if {[contains_ifunc_symbol tmpdir/static_prog] != 1} { fail "Static ifunc-using executable does not contain an IFUNC symbol" set fails [expr $fails + 1] } -if {[contains_ifunc_symbol tmpdir/dynamic_prog] != 1} { - fail "Dynamic ifunc-using executable does not contain an IFUNC symbol" +if {[contains_ifunc_symbol tmpdir/dynamic_prog] != 0} { + fail "Dynamic ifunc-using executable contains an IFUNC symbol" set fails [expr $fails + 1] } if {[contains_ifunc_symbol tmpdir/static_nonifunc_prog] != 0} { fail "Static non-ifunc-using executable contains an IFUNC symbol" set fails [expr $fails + 1] } +if {[contains_ifunc_symbol tmpdir/test-1] != 0} { + fail "test-1 contains IFUNC symbols" + set fails [expr $fails + 1] +} +if {[contains_ifunc_symbol tmpdir/libtest-2.so] != 0} { + fail "libtest-2.so contains IFUNC symbols" + set fails [expr $fails + 1] +} # The linked ifunc using executables and shared libraries should contain # a dynamic reloc referencing the IFUNC symbol. (Even the static @@ -289,8 +321,8 @@ if {[contains_irelative_reloc tmpdir/static_prog] != 1} { fail "Static ifunc-using executable does not contain R_*_IRELATIVE relocation" set fails [expr $fails + 1] } -if {[contains_ifunc_reloc tmpdir/dynamic_prog] != 1} { - fail "Dynamic ifunc-using executable does not contain a reloc against an IFUNC symbol" +if {[contains_ifunc_reloc tmpdir/dynamic_prog] != 0} { + fail "Dynamic ifunc-using executable contains a reloc against an IFUNC symbol" set fails [expr $fails + 1] } if {[contains_ifunc_reloc tmpdir/static_nonifunc_prog] == 1} { @@ -317,6 +349,72 @@ if { $verbose < 1 } { remote_file host delete "tmpdir/static_nonifunc_prog" } +run_cc_link_tests [list \ + [list \ + "Build libpr16467a.so" \ + "-shared -Wl,--version-script=pr16467a.map" \ + "-fPIC" \ + { pr16467a.c } \ + {} \ + "libpr16467a.so" \ + ] \ + [list \ + "Build libpr16467b.a" \ + "" \ + "-fPIC" \ + { pr16467b.c } \ + {} \ + "libpr16467b.a" \ + ] \ + [list \ + "Build libpr16467b.so" \ + "-shared tmpdir/pr16467b.o tmpdir/libpr16467a.so \ + -Wl,--version-script=pr16467b.map" \ + "-fPIC" \ + { dummy.c } \ + {} \ + "libpr16467b.so" \ + ] \ + [list \ + "Build libpr16467c.a" \ + "" \ + "" \ + { pr16467c.c } \ + {} \ + "libpr16467c.a" \ + ] \ +] + +run_ld_link_exec_tests [] [list \ + [list \ + "Common symbol override ifunc test 1a" \ + "-static" \ + "" \ + { ifunc-common-1a.c ifunc-common-1b.c } \ + "ifunc-common-1a" \ + "ifunc-common-1.out" \ + "-g" \ + ] \ + [list \ + "Common symbol override ifunc test 1b" \ + "-static" \ + "" \ + { ifunc-common-1b.c ifunc-common-1a.c } \ + "ifunc-common-1b" \ + "ifunc-common-1.out" \ + "-g" \ + ] \ + [list \ + "Run pr16467" \ + "tmpdir/pr16467c.o tmpdir/libpr16467b.so tmpdir/libpr16467a.so" \ + "" \ + { dummy.c } \ + "pr16467" \ + "pr16467.out" \ + "" \ + ] \ +] + set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]] foreach t $test_list { # We need to strip the ".d", but can leave the dirname.