i386: Issue an error on non-PIC call to IFUNC in PIC object
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 29 Aug 2016 15:12:59 +0000 (08:12 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 29 Aug 2016 15:14:45 +0000 (08:14 -0700)
commit74437ea28fb611d4c88077b486fd7c0a8b4c2a25
tree9260072fac164803e6f715c593fe5a7d2e500c2e
parent7fac69100a7c1fb52b2e044294a858272bad4e46
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.
18 files changed:
bfd/ChangeLog
bfd/elf32-i386.c
ld/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pr20515.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr20515.s [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-14a.s
ld/testsuite/ld-ifunc/ifunc-14c.s
ld/testsuite/ld-ifunc/ifunc-2-i386.s
ld/testsuite/ld-ifunc/ifunc-2-local-i386.s
ld/testsuite/ld-ifunc/ifunc.exp
ld/testsuite/ld-ifunc/pr19784a.c [deleted file]
ld/testsuite/ld-ifunc/pr19784b.c [deleted file]
ld/testsuite/ld-ifunc/pr19784c.c [deleted file]
ld/testsuite/ld-x86-64/pr19784a.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr19784b.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr19784c.c [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp