diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2018-05-14 03:55:37 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2018-05-14 03:55:50 -0700 |
commit | 4ec0995016801cc5d5cf13baf6e10163861e6852 (patch) | |
tree | f2aa11725ad03aec8080cb88b6415c7fcdf2098f /ld/testsuite/ld-ifunc/ifunc.exp | |
parent | 9bc935ef3380a2d471b9447e2bf8e61297654e2f (diff) | |
download | gdb-4ec0995016801cc5d5cf13baf6e10163861e6852.zip gdb-4ec0995016801cc5d5cf13baf6e10163861e6852.tar.gz gdb-4ec0995016801cc5d5cf13baf6e10163861e6852.tar.bz2 |
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.
Diffstat (limited to 'ld/testsuite/ld-ifunc/ifunc.exp')
-rw-r--r-- | ld/testsuite/ld-ifunc/ifunc.exp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp index d9cc381..9f4aa73 100644 --- a/ld/testsuite/ld-ifunc/ifunc.exp +++ b/ld/testsuite/ld-ifunc/ifunc.exp @@ -581,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 \ @@ -632,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" \ + ] \ ] |