summaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2009-07-10 12:19:58 +0000
committerAlan Modra <amodra@gmail.com>2009-07-10 12:19:58 +0000
commite054468f6cf120142dbfdf64226a5c6c09ecf998 (patch)
tree835b16de7d80522f5f8da90ddcc8bbd59fe58548 /ld
parentfbb8f2990ccfa180274ab4a578818fe247823540 (diff)
downloadbinutils-gdb-e054468f6cf120142dbfdf64226a5c6c09ecf998.tar.gz
STT_GNU_IFUNC support for PowerPC.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog4
-rw-r--r--ld/emulparams/elf32ppc.sh5
-rw-r--r--ld/testsuite/ChangeLog5
-rw-r--r--ld/testsuite/ld-ifunc/ifunc.exp35
4 files changed, 40 insertions, 9 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 551c5c11680..5836c861076 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,7 @@
+2009-07-10 Alan Modra <amodra@bigpond.net.au>
+
+ * emulparams/elf32ppc.sh (GOTPLT, PLT): Handle .iplt.
+
2009-07-06 Matthias Klose <doko@ubuntu.com>
* ld.texinfo: Fix typo.
diff --git a/ld/emulparams/elf32ppc.sh b/ld/emulparams/elf32ppc.sh
index 7349993f6c5..49cc9502188 100644
--- a/ld/emulparams/elf32ppc.sh
+++ b/ld/emulparams/elf32ppc.sh
@@ -10,8 +10,9 @@ SDATA_GOT=
SEPARATE_GOTPLT=0
BSS_PLT=
GOT=".got ${RELOCATING-0} : SPECIAL { *(.got) }"
-PLT=".plt ${RELOCATING-0} : SPECIAL { *(.plt) }"
-GOTPLT="${PLT}"
+GOTPLT=".plt ${RELOCATING-0} : SPECIAL { *(.plt) }"
+PLT=".plt ${RELOCATING-0} : SPECIAL { *(.plt) *(.iplt) }
+ .iplt ${RELOCATING-0} : { *(.iplt) }"
OTHER_TEXT_SECTIONS="*(.glink)"
EXTRA_EM_FILE=ppc32elf
if grep -q 'ld_elf32_spu_emulation' ldemul-list.h; then
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 5e4b7107f6f..be6e2e5a7cd 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-10 Alan Modra <amodra@bigpond.net.au>
+
+ * ld-ifunc/ifunc.exp: Run for powerpc. Really generate static
+ executables, renaming the existing dynamic but local tests.
+
2009-07-08 Alan Modra <amodra@bigpond.net.au>
* ld-selective/selective.exp: Remove check that $CC contains the
diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp
index 6840e4e6abf..3320b824a0b 100644
--- a/ld/testsuite/ld-ifunc/ifunc.exp
+++ b/ld/testsuite/ld-ifunc/ifunc.exp
@@ -23,11 +23,15 @@
# 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
}
@@ -195,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]
}
@@ -221,6 +229,10 @@ 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]
@@ -242,6 +254,10 @@ 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]
@@ -264,6 +280,10 @@ 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]
@@ -291,6 +311,7 @@ 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"
}