ld: Unify STT_GNU_IFUNC handling
[deliverable/binutils-gdb.git] / ld / testsuite / ld-ifunc / ifunc.exp
index 628712389e8ad824a70153aa49ea63ed2d079bbd..dd3abd475ae2c328212f5cc424a5c9e4f8b9e276 100644 (file)
@@ -33,10 +33,8 @@ if {!(([istarget "i?86-*-*"]
        || [istarget "s390*-*-*"])
       && ([istarget "*-*-elf*"]
          || [istarget "*-*-nacl*"]
-         || (([istarget "*-*-linux*"]
-              || [istarget "*-*-gnu*"])
-             && ![istarget "*-*-*aout*"]
-             && ![istarget "*-*-*oldld*"]))) } {
+         || [istarget "*-*-linux*"]
+         || [istarget "*-*-gnu*"])) } {
     verbose "IFUNC tests not run - target does not support IFUNC"
     return
 }
@@ -47,6 +45,16 @@ if ![check_shared_lib_support] {
     return
 }
 
+# This test does not need a compiler...
+run_dump_test "ifuncmod5"
+
+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]
+}
+
 # We need a working compiler.  (Strictly speaking this is
 # not true, we could use target specific assembler files).
 if { [which $CC] == 0 } {
@@ -218,13 +226,15 @@ if ![ld_link $CC "tmpdir/local_prog" "$NOPIE_LDFLAGS -Wl,--no-as-needed,-rpath=.
     fail "Could not link a dynamic executable using local ifunc"
     set fails [expr $fails + 1]
 }
-if ![ld_link $CC "tmpdir/static_prog" "-static -Ltmpdir tmpdir/static_prog.o -lifunc"] {
-    fail "Could not link a static executable"
-    set fails [expr $fails + 1]
-}
-if ![ld_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 ![string match "" $STATIC_LDFLAGS] {
+    if ![ld_link $CC "tmpdir/static_prog" "-static -Ltmpdir tmpdir/static_prog.o -lifunc"] {
+       fail "Could not link a static executable"
+       set fails [expr $fails + 1]
+    }
+    if ![ld_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 ![ld_link $CC "tmpdir/test-1" "-Wl,--no-as-needed,-rpath=./tmpdir tmpdir/test-1.o tmpdir/libshared_ifunc.so"] {
     fail "Could not link test-1"
@@ -265,7 +275,8 @@ if {! [check_osabi tmpdir/local_prog {UNIX - GNU}]} {
     fail "Local ifunc-using executable does not have an OS/ABI field of GNU"
     set fails [expr $fails + 1]
 }
-if {! [check_osabi tmpdir/static_prog {UNIX - GNU}]} {
+if { ![string match "" $STATIC_LDFLAGS] \
+     && ![check_osabi tmpdir/static_prog {UNIX - GNU}]} {
     fail "Static ifunc-using executable does not have an OS/ABI field of GNU"
     set fails [expr $fails + 1]
 }
@@ -290,7 +301,8 @@ 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} {
+if { ![string match "" $STATIC_LDFLAGS] \
+     && [contains_ifunc_symbol tmpdir/static_prog] != 1} {
     fail "Static ifunc-using executable does not contain an IFUNC symbol"
     set fails [expr $fails + 1]
 }
@@ -328,7 +340,8 @@ 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} {
+if { ![string match "" $STATIC_LDFLAGS] \
+    && [contains_irelative_reloc tmpdir/static_prog] != 1} {
     fail "Static ifunc-using executable does not contain R_*_IRELATIVE relocation"
     set fails [expr $fails + 1]
 }
@@ -419,13 +432,6 @@ run_ld_link_exec_tests [list \
     ] \
 ]
 
-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]
-}
-
 # Run-time tests which require working IFUNC support.
 if { ![check_ifunc_available] } {
     return
@@ -575,6 +581,76 @@ run_cc_link_tests [list \
        {} \
        "libpr18841cn.so" \
     ] \
+    [list \
+       "Build libpr23169a.so" \
+       "-shared" \
+       "-fPIC -O2 -g" \
+       { pr23169a.c } \
+       {} \
+       "libpr23169a.so" \
+    ] \
+    [list \
+       "Build libpr23169b.so" \
+       "-shared -Wl,-z,now" \
+       "-fPIC -O2 -g" \
+       { pr23169a.c } \
+       {} \
+       "libpr23169b.so" \
+    ] \
+    [list \
+       "Build pr23169a" \
+       "$NOPIE_LDFLAGS -Wl,--no-as-needed tmpdir/libpr23169a.so" \
+       "$NOPIE_CFLAGS -O2 -g" \
+       { pr23169b.c pr23169c.c } \
+       {{readelf {--dyn-syms} pr23169a.rd} \
+        {readelf {-r -W} pr23169b.rd}} \
+       "pr23169a" \
+    ] \
+    [list \
+       "Build pr23169b" \
+       "-pie -Wl,--no-as-needed tmpdir/libpr23169a.so" \
+       "-fPIE -O2 -g" \
+       { pr23169b.c pr23169c.c } \
+       {{readelf {--dyn-syms} pr23169c.rd} \
+        {readelf {-r -W} pr23169b.rd}} \
+       "pr23169b" \
+    ] \
+    [list \
+       "Build pr23169c" \
+       "$NOPIE_LDFLAGS -Wl,--no-as-needed tmpdir/libpr23169a.so" \
+       "-fPIE -O2 -g" \
+       { pr23169b.c pr23169c.c } \
+       {{readelf {--dyn-syms} pr23169c.rd} \
+        {readelf {-r -W} pr23169b.rd}} \
+       "pr23169c" \
+    ] \
+    [list \
+       "Build pr23169d" \
+       "$NOPIE_LDFLAGS -Wl,--no-as-needed,-z,now tmpdir/libpr23169b.so" \
+       "$NOPIE_CFLAGS -O2 -g" \
+       { pr23169b.c pr23169c.c } \
+       {{readelf {--dyn-syms} pr23169a.rd} \
+        {readelf {-r -W} pr23169b.rd}} \
+       "pr23169d" \
+    ] \
+    [list \
+       "Build pr23169e" \
+       "-pie -Wl,--no-as-needed,-z,now tmpdir/libpr23169b.so" \
+       "-fPIE -O2 -g" \
+       { pr23169b.c pr23169c.c } \
+       {{readelf {--dyn-syms} pr23169c.rd} \
+        {readelf {-r -W} pr23169b.rd}} \
+       "pr23169e" \
+    ] \
+    [list \
+       "Build pr23169f" \
+       "$NOPIE_LDFLAGS -Wl,--no-as-needed,-z,now tmpdir/libpr23169b.so" \
+       "-fPIE -O2 -g" \
+       { pr23169b.c pr23169c.c } \
+       {{readelf {--dyn-syms} pr23169c.rd} \
+        {readelf {-r -W} pr23169b.rd}} \
+       "pr23169f" \
+    ] \
 ]
 
 run_ld_link_exec_tests [list \
@@ -626,4 +702,58 @@ run_ld_link_exec_tests [list \
        "pr18841cn" \
        "pr18841.out" \
     ] \
+    [list \
+       "Run pr23169a" \
+       "$NOPIE_LDFLAGS -Wl,--no-as-needed tmpdir/libpr23169a.so" \
+       "" \
+       { pr23169b.c pr23169c.c } \
+       "pr23169a" \
+       "pass.out" \
+       "$NOPIE_CFLAGS -O2 -g" \
+    ] \
+    [list \
+       "Run pr23169b" \
+       "-pie -Wl,--no-as-needed tmpdir/libpr23169a.so" \
+       "" \
+       { pr23169b.c pr23169c.c } \
+       "pr23169b" \
+       "pass.out" \
+       "-fPIE -O2 -g" \
+    ] \
+    [list \
+       "Run pr23169c" \
+       "$NOPIE_LDFLAGS -Wl,--no-as-needed tmpdir/libpr23169a.so" \
+       "" \
+       { pr23169b.c pr23169c.c } \
+       "pr23169c" \
+       "pass.out" \
+       "-fPIE -O2 -g" \
+    ] \
+    [list \
+       "Run pr23169d" \
+       "$NOPIE_LDFLAGS -Wl,--no-as-needed,-z,now tmpdir/libpr23169b.so" \
+       "" \
+       { pr23169b.c pr23169c.c } \
+       "pr23169d" \
+       "pass.out" \
+       "$NOPIE_CFLAGS -O2 -g" \
+    ] \
+    [list \
+       "Run pr23169e" \
+       "-pie -Wl,--no-as-needed,-z,now tmpdir/libpr23169b.so" \
+       "" \
+       { pr23169b.c pr23169c.c } \
+       "pr23169e" \
+       "pass.out" \
+       "-fPIE -O2 -g" \
+    ] \
+    [list \
+       "Run pr23169f" \
+       "$NOPIE_LDFLAGS -Wl,--no-as-needed,-z,now tmpdir/libpr23169b.so" \
+       "" \
+       { pr23169b.c pr23169c.c } \
+       "pr23169f" \
+       "pass.out" \
+       "-fPIE -O2 -g" \
+    ] \
 ]
This page took 0.025673 seconds and 4 git commands to generate.