aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-i386
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2016-08-29 08:12:59 -0700
committerH.J. Lu <hjl.tools@gmail.com>2016-08-29 08:14:45 -0700
commit74437ea28fb611d4c88077b486fd7c0a8b4c2a25 (patch)
tree9260072fac164803e6f715c593fe5a7d2e500c2e /ld/testsuite/ld-i386
parent7fac69100a7c1fb52b2e044294a858272bad4e46 (diff)
i386: Issue an error on non-PIC call to IFUNC in PIC object
On i386, IFUNC function must be called via PLT. Since PLT in PIC object uses EBX register, R_386_PLT32 relocation must be used to call IFUNC function even when IFUNC function is defined locally. Linker should issue an error when R_386_PC32 relocation is used to call IFUNC function. Since PR ld/19784 tests doesn't use PLT relocation to local IFUNC function, they are moved to the x86-64 test directory. bfd/ PR ld/14961 PR ld/20515 * elf32-i386.c (elf_i386_check_relocs): Issue an error when R_386_PC32 relocation is used to call IFUNC function in PIC object. ld/ PR ld/14961 PR ld/20515 * testsuite/ld-i386/i386.exp: Run pr20515. * testsuite/ld-i386/pr20515.d: New file. * testsuite/ld-i386/pr20515.s: Likewise. * testsuite/ld-ifunc/ifunc-14a.s: Use R_386_PLT32 to call IFUNC function. * testsuite/ld-ifunc/ifunc-14c.s: Likewise. * testsuite/ld-ifunc/ifunc-2-i386.s: Likewise. * testsuite/ld-ifunc/ifunc-2-local-i386.s: Likewise. * testsuite/ld-ifunc/ifunc.exp: Move PR ld/19784 tests to ... * testsuite/ld-x86-64/x86-64.exp: Here. * testsuite/ld-ifunc/pr19784a.c: Moved to ... * testsuite/ld-x86-64/pr19784a.c: Here. * testsuite/ld-ifunc/pr19784b.c: Moved to ... * testsuite/ld-x86-64/pr19784b.c: Here. * testsuite/ld-ifunc/pr19784c.c: Moved to ... * testsuite/ld-x86-64/pr19784c.c: Here.
Diffstat (limited to 'ld/testsuite/ld-i386')
-rw-r--r--ld/testsuite/ld-i386/i386.exp1
-rw-r--r--ld/testsuite/ld-i386/pr20515.d3
-rw-r--r--ld/testsuite/ld-i386/pr20515.s12
3 files changed, 16 insertions, 0 deletions
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 2ba0f054d9..aedec41dfe 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -413,6 +413,7 @@ run_dump_test "pr20253-4a"
run_dump_test "pr20253-4b"
run_dump_test "pr20253-4c"
run_dump_test "pr20253-5"
+run_dump_test "pr20515"
if { !([istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/pr20515.d b/ld/testsuite/ld-i386/pr20515.d
new file mode 100644
index 0000000000..f3f5fecfc4
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr20515.d
@@ -0,0 +1,3 @@
+#as: --32
+#ld: -m elf_i386 -shared
+#error: unsupported non-PIC call to IFUNC `foo'
diff --git a/ld/testsuite/ld-i386/pr20515.s b/ld/testsuite/ld-i386/pr20515.s
new file mode 100644
index 0000000000..eb86cbc4a5
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr20515.s
@@ -0,0 +1,12 @@
+ .text
+ .globl bar
+ .type bar, @function
+bar:
+ jmp foo
+ .size bar, .-bar
+ .hidden foo
+ .type foo, %gnu_indirect_function
+ .globl foo
+foo:
+ ret
+ .size foo, .-foo