diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2016-08-29 08:12:59 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2016-08-29 08:14:45 -0700 |
commit | 74437ea28fb611d4c88077b486fd7c0a8b4c2a25 (patch) | |
tree | 9260072fac164803e6f715c593fe5a7d2e500c2e /ld/testsuite/ld-ifunc | |
parent | 7fac69100a7c1fb52b2e044294a858272bad4e46 (diff) | |
download | gdb-74437ea28fb611d4c88077b486fd7c0a8b4c2a25.zip gdb-74437ea28fb611d4c88077b486fd7c0a8b4c2a25.tar.gz gdb-74437ea28fb611d4c88077b486fd7c0a8b4c2a25.tar.bz2 |
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-ifunc')
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc-14a.s | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc-14c.s | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc-2-i386.s | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc-2-local-i386.s | 2 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc.exp | 40 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/pr19784a.c | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/pr19784b.c | 11 | ||||
-rw-r--r-- | ld/testsuite/ld-ifunc/pr19784c.c | 11 |
8 files changed, 4 insertions, 72 deletions
diff --git a/ld/testsuite/ld-ifunc/ifunc-14a.s b/ld/testsuite/ld-ifunc/ifunc-14a.s index 9f20604..87bc0ef 100644 --- a/ld/testsuite/ld-ifunc/ifunc-14a.s +++ b/ld/testsuite/ld-ifunc/ifunc-14a.s @@ -2,6 +2,6 @@ .globl bar .type bar, @function bar: - jmp foo + jmp foo@PLT .size bar, .-bar .hidden foo diff --git a/ld/testsuite/ld-ifunc/ifunc-14c.s b/ld/testsuite/ld-ifunc/ifunc-14c.s index 3cde56e..1a714cb 100644 --- a/ld/testsuite/ld-ifunc/ifunc-14c.s +++ b/ld/testsuite/ld-ifunc/ifunc-14c.s @@ -2,6 +2,6 @@ .globl xxx .type xxx, @function xxx: - jmp foo + jmp foo@PLT .size xxx, .-xxx .hidden foo diff --git a/ld/testsuite/ld-ifunc/ifunc-2-i386.s b/ld/testsuite/ld-ifunc/ifunc-2-i386.s index 32d8812..e84d6b7 100644 --- a/ld/testsuite/ld-ifunc/ifunc-2-i386.s +++ b/ld/testsuite/ld-ifunc/ifunc-2-i386.s @@ -15,7 +15,7 @@ bar: .L6: popl %ebx addl $_GLOBAL_OFFSET_TABLE_+[.-.L6], %ebx - call __GI_foo + call __GI_foo@PLT leal __GI_foo@GOTOFF(%ebx), %eax ret .size bar, .-bar diff --git a/ld/testsuite/ld-ifunc/ifunc-2-local-i386.s b/ld/testsuite/ld-ifunc/ifunc-2-local-i386.s index 4e0b6ae..a69e060 100644 --- a/ld/testsuite/ld-ifunc/ifunc-2-local-i386.s +++ b/ld/testsuite/ld-ifunc/ifunc-2-local-i386.s @@ -12,7 +12,7 @@ bar: .L6: popl %ebx addl $_GLOBAL_OFFSET_TABLE_+[.-.L6], %ebx - call __GI_foo + call __GI_foo@PLT leal __GI_foo@GOTOFF(%ebx), %eax ret .size bar, .-bar diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp index c3c9379..504007a 100644 --- a/ld/testsuite/ld-ifunc/ifunc.exp +++ b/ld/testsuite/ld-ifunc/ifunc.exp @@ -505,30 +505,6 @@ run_cc_link_tests [list \ {} \ "libpr18841c.so" \ ] \ - [list \ - "Build libpr19784a.so" \ - "-shared -Wl,-Bsymbolic-functions" \ - "-fPIC -O2 -g" \ - { pr19784b.c pr19784c.c } \ - {} \ - "libpr19784a.so" \ - ] \ - [list \ - "Build libpr19784b.so" \ - "-shared -Wl,-Bsymbolic-functions" \ - "-fPIC -O2 -g" \ - { pr19784c.c pr19784b.c } \ - {} \ - "libpr19784b.so" \ - ] \ - [list \ - "Build pr19784a.o" \ - "" \ - "" \ - { pr19784a.c } \ - "" \ - "" \ - ] \ ] run_ld_link_exec_tests [list \ @@ -556,20 +532,4 @@ run_ld_link_exec_tests [list \ "pr18841c" \ "pr18841.out" \ ] \ - [list \ - "Run pr19784a" \ - "tmpdir/pr19784a.o tmpdir/libpr19784a.so" \ - "" \ - { dummy.c } \ - "pr19784a" \ - "pass.out" \ - ] \ - [list \ - "Run pr19784b" \ - "--as-needed tmpdir/pr19784a.o tmpdir/libpr19784b.so" \ - "" \ - { dummy.c } \ - "pr19784b" \ - "pass.out" \ - ] \ ] diff --git a/ld/testsuite/ld-ifunc/pr19784a.c b/ld/testsuite/ld-ifunc/pr19784a.c deleted file mode 100644 index c922cb9..0000000 --- a/ld/testsuite/ld-ifunc/pr19784a.c +++ /dev/null @@ -1,6 +0,0 @@ -void bar(void); -int main(void) -{ - bar(); - return 0; -} diff --git a/ld/testsuite/ld-ifunc/pr19784b.c b/ld/testsuite/ld-ifunc/pr19784b.c deleted file mode 100644 index 8ea7ce2..0000000 --- a/ld/testsuite/ld-ifunc/pr19784b.c +++ /dev/null @@ -1,11 +0,0 @@ -int foo (int x) __attribute__ ((ifunc ("resolve_foo"))); - -static int foo_impl(int x) -{ - return x; -} - -void *resolve_foo (void) -{ - return (void *) foo_impl; -} diff --git a/ld/testsuite/ld-ifunc/pr19784c.c b/ld/testsuite/ld-ifunc/pr19784c.c deleted file mode 100644 index 117dfec..0000000 --- a/ld/testsuite/ld-ifunc/pr19784c.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -extern void abort (void); -extern int foo (int) __attribute__ ((visibility("hidden"))); - -int bar() -{ - if (foo (5) != 5) - abort (); - printf("PASS\n"); -} |