aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-ifunc/ifunc.exp
diff options
context:
space:
mode:
Diffstat (limited to 'ld/testsuite/ld-ifunc/ifunc.exp')
-rw-r--r--ld/testsuite/ld-ifunc/ifunc.exp69
1 files changed, 59 insertions, 10 deletions
diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp
index 2ba5da1..6840e4e 100644
--- a/ld/testsuite/ld-ifunc/ifunc.exp
+++ b/ld/testsuite/ld-ifunc/ifunc.exp
@@ -98,6 +98,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 } {
@@ -184,11 +211,16 @@ 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/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 +234,14 @@ 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/static_prog] != 1} {
fail "Static ifunc-using executable does not contain an IFUNC symbol"
set fails [expr $fails + 1]
@@ -218,12 +255,17 @@ 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/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} {
@@ -252,3 +294,10 @@ if { $verbose < 1 } {
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]
+}