aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-x86-64/x86-64.exp
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2018-02-14 03:50:40 -0800
committerH.J. Lu <hjl.tools@gmail.com>2018-02-14 03:50:55 -0800
commit451875b4f976a527395e9303224c7881b65e12ed (patch)
tree15ebc416aa1dd49b234ad02dfdf8a9ebe4f92f11 /ld/testsuite/ld-x86-64/x86-64.exp
parentf98b2e334fcca666afaee3c6546b9fc91a4963d4 (diff)
downloadgdb-451875b4f976a527395e9303224c7881b65e12ed.zip
gdb-451875b4f976a527395e9303224c7881b65e12ed.tar.gz
gdb-451875b4f976a527395e9303224c7881b65e12ed.tar.bz2
x86-64: Use PLT address for PC-relative reloc
Since PLT in PDE and PC-relative PLT in PIE can be used as function address, there is no need for dynamic PC-relative relocation against a dynamic function definition in PIE. Linker should resolve PC-relative reference to its PLT address. NB: i386 has non-PIC PLT and PIC PLT. Only non-PIC PLT in PDE can be used as function address. PIC PLT in PIE can't be used as function address. bfd/ PR ld/22842 * elf32-i386.c (elf_i386_check_relocs): Pass FALSE for non PC-relative PLT to NEED_DYNAMIC_RELOCATION_P. * elf64-x86-64.c (elf_x86_64_check_relocs): Create PLT for R_X86_64_PC32 reloc against dynamic function in data section. Pass TRUE for PC-relative PLT to NEED_DYNAMIC_RELOCATION_P. (elf_x86_64_relocate_section): Use PLT for R_X86_64_PC32 reloc against dynamic function in data section. * elfxx-x86.c (elf_x86_allocate_dynrelocs): Use PLT in PIE as function address only if pcrel_plt is true. (_bfd_x86_elf_link_hash_table_create): Set pcrel_plt. * elfxx-x86.h (NEED_DYNAMIC_RELOCATION_P): Add PCREL_PLT for PC-relative PLT. If PLT is PC-relative, don't generate dynamic PC-relative relocation against a function definition in data secton in PIE. Remove the obsolete comments. (elf_x86_link_hash_table): Add pcrel_plt. ld/ PR ld/22842 * testsuite/ld-i386/i386.exp: Run PR ld/22842 tests. * testsuite/ld-x86-64/x86-64.exp: Likewise. * testsuite/ld-i386/pr22842a.c: New file. * testsuite/ld-i386/pr22842b.S: Likewise. * testsuite/ld-x86-64/pr22842a.c: Likewise. * testsuite/ld-x86-64/pr22842a.rd: Likewise. * testsuite/ld-x86-64/pr22842b.S: Likewise. * testsuite/ld-x86-64/pr22842b.rd: Likewise.
Diffstat (limited to 'ld/testsuite/ld-x86-64/x86-64.exp')
-rw-r--r--ld/testsuite/ld-x86-64/x86-64.exp25
1 files changed, 25 insertions, 0 deletions
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 8442663..2a46266 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -1190,6 +1190,23 @@ if { [isnative] && [which $CC] != 0 } {
{{readelf -drW pr22791-2.rd}} \
"pr22791-2" \
] \
+ [list \
+ "Build pr22842.so" \
+ "-shared" \
+ "-fPIC" \
+ { pr22842a.c } \
+ {} \
+ "pr22842.so" \
+ ] \
+ [list \
+ "Build pr22842" \
+ "-pie -Wl,--no-as-needed tmpdir/pr22842.so" \
+ "" \
+ { pr22842b.S } \
+ {{readelf -rW pr22842a.rd} \
+ {readelf -rW pr22842b.rd}} \
+ "pr22842" \
+ ] \
]
if {[istarget "x86_64-*-linux*-gnux32"]} {
@@ -1524,6 +1541,14 @@ if { [isnative] && [which $CC] != 0 } {
"pass.out" \
"$NOPIE_CFLAGS" \
] \
+ [list \
+ "Build pr22842" \
+ "-pie -Wl,--no-as-needed tmpdir/pr22842.so" \
+ "" \
+ { pr22842b.S } \
+ "pr22842" \
+ "pass.out" \
+ ] \
]
# Run-time tests which require working ifunc attribute support.