summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2009-07-21 21:37:26 +0000
committerH.J. Lu <hjl.tools@gmail.com>2009-07-21 21:37:26 +0000
commit2955ec4c12dbffa517fe1d821e7c5d1f7dde5f8a (patch)
treea3254338492bb90ae7489943bbb9e5cdb584021f /ld
parentc761c4ee3f718cc350577a1cb4e49fb8cf16c8f3 (diff)
downloadbinutils-gdb-2955ec4c12dbffa517fe1d821e7c5d1f7dde5f8a.tar.gz
bfd/
2009-07-21 H.J. Lu <hongjiu.lu@intel.com> PR ld/10426 * elflink.c (elf_link_add_object_symbols): Turn an IFUNC symbol from a DSO into a normal FUNC symbol. (elf_link_output_extsym): Turn an undefined IFUNC symbol into a normal FUNC symbol. ld/testsuite/ 2009-07-21 H.J. Lu <hongjiu.lu@intel.com> PR ld/10426 * ld-ifunc/ifunc.exp: Check test-1 and libtest-2.so. Updated. * ld-ifunc/test-1.c: New. * ld-ifunc/test-2.c: Likewise.
Diffstat (limited to 'ld')
-rw-r--r--ld/testsuite/ChangeLog8
-rw-r--r--ld/testsuite/ld-ifunc/ifunc.exp32
-rw-r--r--ld/testsuite/ld-ifunc/test-1.c3
-rw-r--r--ld/testsuite/ld-ifunc/test-2.c3
4 files changed, 42 insertions, 4 deletions
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 2ef2e2aebb1..e1333f2690a 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2009-07-21 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR ld/10426
+ * ld-ifunc/ifunc.exp: Check test-1 and libtest-2.so. Updated.
+
+ * ld-ifunc/test-1.c: New.
+ * ld-ifunc/test-2.c: Likewise.
+
2009-07-17 Chao-ying Fu <fu@mips.com>
* ld-mips-elf/pic-and-nonpic-3b.dd: Updated to use new PLT
diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp
index 6824d04a5b1..786b32b2a45 100644
--- a/ld/testsuite/ld-ifunc/ifunc.exp
+++ b/ld/testsuite/ld-ifunc/ifunc.exp
@@ -181,6 +181,14 @@ 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" "$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]
+}
if { $fails != 0 } {
return
@@ -215,6 +223,14 @@ 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"
@@ -266,14 +282,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
@@ -292,8 +316,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} {
diff --git a/ld/testsuite/ld-ifunc/test-1.c b/ld/testsuite/ld-ifunc/test-1.c
new file mode 100644
index 00000000000..6930e56d27a
--- /dev/null
+++ b/ld/testsuite/ld-ifunc/test-1.c
@@ -0,0 +1,3 @@
+extern int library_func2 (void);
+int (*fn) (void) = library_func2;
+int main (void) { fn (); return 0; }
diff --git a/ld/testsuite/ld-ifunc/test-2.c b/ld/testsuite/ld-ifunc/test-2.c
new file mode 100644
index 00000000000..8343d0c139f
--- /dev/null
+++ b/ld/testsuite/ld-ifunc/test-2.c
@@ -0,0 +1,3 @@
+extern int library_func2 (void);
+int foo (void) { library_func2 (); return 0; }
+__asm__(".type library_func2, %gnu_indirect_function");