diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 4 | ||||
-rw-r--r-- | ld/emulparams/elf32ppc.sh | 5 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc.exp | 35 |
4 files changed, 40 insertions, 9 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 551c5c1..5836c86 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 7349993..49cc950 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 5e4b710..be6e2e5 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 6840e4e..3320b82 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" } |