diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2009-07-21 21:37:26 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2009-07-21 21:37:26 +0000 |
commit | 2955ec4c12dbffa517fe1d821e7c5d1f7dde5f8a (patch) | |
tree | a3254338492bb90ae7489943bbb9e5cdb584021f /ld | |
parent | c761c4ee3f718cc350577a1cb4e49fb8cf16c8f3 (diff) | |
download | fsf-binutils-gdb-2955ec4c12dbffa517fe1d821e7c5d1f7dde5f8a.zip fsf-binutils-gdb-2955ec4c12dbffa517fe1d821e7c5d1f7dde5f8a.tar.gz fsf-binutils-gdb-2955ec4c12dbffa517fe1d821e7c5d1f7dde5f8a.tar.bz2 |
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/ChangeLog | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc.exp | 32 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/test-1.c | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/test-2.c | 3 |
4 files changed, 42 insertions, 4 deletions
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 2ef2e2a..e1333f2 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 6824d04..786b32b 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 0000000..6930e56 --- /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 0000000..8343d0c --- /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"); |