2009-07-10 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / ld / testsuite / ld-ifunc / ifunc.exp
index 2ba5da12f066199de6920f8b35fcdf2f5543f410..3320b824a0bff1412180c6aeaba346f4468c6217 100644 (file)
 # Written by Nick Clifton <nickc@redhat.com>
 
 
-# IFUNC support has only been implemented for the x86_64 and ix86 so far.
-if {! (  [istarget "x86_64-*-elf*"]
-      || [istarget "x86_64-*-linux*"]
-      || [istarget "i?86-*-elf*"]
-      || [istarget "i?86-*-linux*"]) } {
+# IFUNC support has only been implemented for the ix86, x86_64 and powerpc
+# so far.
+if {!(([istarget "i?86-*-*"]
+       || [istarget "x86_64-*-*"]
+       || [istarget "powerpc*-*-*"])
+      && ([istarget "*-*-elf*"]
+         || ([istarget "*-*-linux*"]
+             && ![istarget "*-*-*aout*"]
+             && ![istarget "*-*-*oldld*"]))) } {
     verbose "IFUNC tests not run - target does not support IFUNC"
     return
 }
@@ -98,6 +102,33 @@ proc contains_ifunc_symbol { binary_file } {
     return 1
 }
 
+# A procedure to confirm that a file contains the R_*_IRELATIVE
+# relocation.
+# Returns -1 upon error, 0 if the relocation was not found and 1 if
+# it was found.
+proc contains_irelative_reloc { binary_file } {
+    global READELF
+    global READELFFLAGS
+
+    catch "exec $READELF $READELFFLAGS --relocs --wide $binary_file > readelf.out" got
+
+    if ![string match "" $got] then {
+       verbose "proc contains_irelative_reloc: Readelf produced unexpected out processing $binary_file: $got"
+       return -1
+    }
+
+    # Look for a line like this:
+    #    0000000000600ab0  0000000000000025 R_X86_64_IRELATIVE      000000000040061c
+    #    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]] } {
+       return 0
+    }
+
+    return 1
+}
+
 # A procedure to confirm that a file contains a relocation that references an IFUNC symbol.
 # Returns -1 upon error, 0 if the reloc was not found and 1 if it was found.
 proc contains_ifunc_reloc { binary_file } {
@@ -168,11 +199,15 @@ if ![default_ld_link $ld "tmpdir/dynamic_prog" "-Ltmpdir tmpdir/shared_prog.o -B
     fail "Could not link a dynamic executable"
     set fails [expr $fails + 1]
 }
-if ![default_ld_link $ld "tmpdir/static_prog" "-Ltmpdir tmpdir/static_prog.o -lifunc"] {
+if ![default_ld_link $ld "tmpdir/local_prog" "-Ltmpdir tmpdir/static_prog.o -lifunc"] {
+    fail "Could not link a dynamic executable using local ifunc"
+    set fails [expr $fails + 1]
+}
+if ![default_ld_link $ld "tmpdir/static_prog" "-static -Ltmpdir tmpdir/static_prog.o -lifunc"] {
     fail "Could not link a static executable"
     set fails [expr $fails + 1]
 }
-if ![default_ld_link $ld "tmpdir/static_nonifunc_prog" "-Ltmpdir tmpdir/static_prog.o tmpdir/static_noifunc.o"] {
+if ![default_ld_link $ld "tmpdir/static_nonifunc_prog" "-static -Ltmpdir tmpdir/static_prog.o tmpdir/static_noifunc.o"] {
     fail "Could not link a non-ifunc using static executable"
     set fails [expr $fails + 1]
 }
@@ -184,11 +219,20 @@ if { $fails == 0 } {
     return
 }
 
-# Check the executables.
+# Check the executables and shared libraries
 #
-# The linked ifunc using executables should have an OSABI field of LINUX
-# The linked non-ifunc using executable should have an OSABI field of NONE (aka System V).
+# The linked ifunc using executables and the shared library containing
+# ifunc should have an OSABI field of LINUX.  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"
+    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"
+    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"
     set fails [expr $fails + 1]
@@ -202,9 +246,18 @@ if {! [check_osabi tmpdir/static_nonifunc_prog {UNIX - System V}]} {
     set fails [expr $fails + 1]
 }
 
-# The linked ifunc using executables should contain an IFUNC symbol,
-# The non-ifunc using executable should not.
+# The linked ifunc using executables and the shared library containing
+# ifunc should contain an IFUNC symbol.  The non-ifunc using executable
+# should not.
 
+if {[contains_ifunc_symbol tmpdir/libshared_ifunc.so] != 1} {
+    fail "Shared libraries containing ifunc does not contain an IFUNC symbol"
+    set fails [expr $fails + 1]
+}
+if {[contains_ifunc_symbol tmpdir/local_prog] != 1} {
+    fail "Local ifunc-using executable does not contain an IFUNC symbol"
+    set fails [expr $fails + 1]
+}
 if {[contains_ifunc_symbol tmpdir/static_prog] != 1} {
     fail "Static ifunc-using executable does not contain an IFUNC symbol"
     set fails [expr $fails + 1]
@@ -218,12 +271,21 @@ if {[contains_ifunc_symbol tmpdir/static_nonifunc_prog] != 0} {
     set fails [expr $fails + 1]
 }
 
-# The linked ifunc using executablea should contain a dynamic reloc referencing the IFUNC symbol.
-# (Even the static executable which should have a dynamic section created for it).
-# The non-ifunc using executable should not.
+# The linked ifunc using executables and shared libraries should contain
+# a dynamic reloc referencing the IFUNC symbol.  (Even the static
+# executable which should have a dynamic section created for it).  The
+# non-ifunc using executable should not.
 
-if {[contains_ifunc_reloc tmpdir/static_prog] != 1} {
-    fail "Static ifunc-using executable does not contain a reloc against an IFUNC symbol"
+if {[contains_irelative_reloc tmpdir/libshared_ifunc.so] != 1} {
+    fail "ifunc-using shared library does not contain R_*_IRELATIVE relocation"
+    set fails [expr $fails + 1]
+}
+if {[contains_irelative_reloc tmpdir/local_prog] != 1} {
+    fail "Local ifunc-using executable does not contain R_*_IRELATIVE relocation"
+    set fails [expr $fails + 1]
+}
+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} {
@@ -249,6 +311,14 @@ if { $verbose < 1 } {
     remote_file host delete "tmpdir/libshared_ifunc.so"
     remote_file host delete "tmpdir/libifunc.a"
     remote_file host delete "tmpdir/dynamic_prog"
+    remote_file host delete "tmpdir/local_prog"
     remote_file host delete "tmpdir/static_prog"
     remote_file host delete "tmpdir/static_nonifunc_prog"
 }
+
+set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]]
+foreach t $test_list {
+    # We need to strip the ".d", but can leave the dirname.
+    verbose [file rootname $t]
+    run_dump_test [file rootname $t]
+}
This page took 0.025763 seconds and 4 git commands to generate.