x86; Allow IFUNC pointer defined in PDE
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 14 May 2018 10:55:37 +0000 (03:55 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 14 May 2018 10:55:50 +0000 (03:55 -0700)
commit4ec0995016801cc5d5cf13baf6e10163861e6852
treef2aa11725ad03aec8080cb88b6415c7fcdf2098f
parent9bc935ef3380a2d471b9447e2bf8e61297654e2f
x86; Allow IFUNC pointer defined in PDE

If IFUNC symbol is defined in position-dependent executable, we should
change it to the normal function and set its address to its PLT entry
which should be resolved by R_*_IRELATIVE at run-time.  All external
references should be resolved to its PLT in executable.

bfd/

PR ld/23169
* elf-ifunc.c (_bfd_elf_allocate_ifunc_dyn_relocs): Don't issue
an error on IFUNC pointer defined in PDE.
* elf32-i386.c (elf_i386_finish_dynamic_symbol): Call
_bfd_x86_elf_link_fixup_ifunc_symbol.
* elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Likewise.
* elfxx-x86.c (_bfd_x86_elf_link_fixup_ifunc_symbol): New
function.
* elfxx-x86.h (_bfd_x86_elf_link_fixup_ifunc_symbol): New.

ld/

PR ld/23169
* testsuite/ld-ifunc/ifunc-9-i386.d: New file.
* testsuite/ld-ifunc/ifunc-9-x86-64.d: Likewise.
* testsuite/ld-ifunc/pr23169a.c: Likewise.
* testsuite/ld-ifunc/pr23169a.rd: Likewise.
* testsuite/ld-ifunc/pr23169b.c: Likewise.
* testsuite/ld-ifunc/pr23169b.c: Likewise.
* testsuite/ld-ifunc/pr23169c.rd: Likewise.
* testsuite/ld-ifunc/pr23169c.rd: Likewise.
* testsuite/ld-ifunc/ifunc-9-x86.d: Removed.
* testsuite/ld-ifunc/ifunc.exp: Run PR ld/23169 tests.
17 files changed:
bfd/ChangeLog
bfd/elf-ifunc.c
bfd/elf32-i386.c
bfd/elf64-x86-64.c
bfd/elfxx-x86.c
bfd/elfxx-x86.h
ld/ChangeLog
ld/testsuite/ld-ifunc/ifunc-9-i386.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-9-x86-64.d [new file with mode: 0644]
ld/testsuite/ld-ifunc/ifunc-9-x86.d [deleted file]
ld/testsuite/ld-ifunc/ifunc.exp
ld/testsuite/ld-ifunc/pr23169a.c [new file with mode: 0644]
ld/testsuite/ld-ifunc/pr23169a.rd [new file with mode: 0644]
ld/testsuite/ld-ifunc/pr23169b.c [new file with mode: 0644]
ld/testsuite/ld-ifunc/pr23169b.rd [new file with mode: 0644]
ld/testsuite/ld-ifunc/pr23169c.c [new file with mode: 0644]
ld/testsuite/ld-ifunc/pr23169c.rd [new file with mode: 0644]