diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-04-22 05:24:54 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-04-22 05:30:01 -0700 |
commit | d5597ebccca6761fb641b7fc99b6e8b56fbac6e2 (patch) | |
tree | a70a40f8a62dc7d494881f71041791e753e8d942 /ld/testsuite/ld-i386/pr17689b.S | |
parent | 712e55b92481d89d01877a0668d8140029feca88 (diff) | |
download | binutils-d5597ebccca6761fb641b7fc99b6e8b56fbac6e2.zip binutils-d5597ebccca6761fb641b7fc99b6e8b56fbac6e2.tar.gz binutils-d5597ebccca6761fb641b7fc99b6e8b56fbac6e2.tar.bz2 |
i386: Allow copy relocs for building PIE
This patch allows copy relocs for R_386_GOTOFF relocations in PIE. For
extern int glob_a;
int foo ()
{
return glob_a;
}
compiler now can optimize it from
call __x86.get_pc_thunk.ax
addl $_GLOBAL_OFFSET_TABLE_, %eax
movl glob_a@GOT(%eax), %eax
movl (%eax), %eax
ret
to
call __x86.get_pc_thunk.ax
addl $_GLOBAL_OFFSET_TABLE_, %eax
movl glob_a@GOTOFF(%eax), %eax
ret
bfd/
PR ld/18289
* elf32-i386.c (elf_i386_link_hash_entry): Add gotoff_ref.
(elf_i386_link_hash_newfunc): Initialize gotoff_ref to 0.
(elf_i386_create_dynamic_sections): Always allow copy relocs for
building executables.
(elf_i386_copy_indirect_symbol): Also copy gotoff_ref.
(elf_i386_check_relocs): Set gotoff_ref for R_386_GOTOFF.
(elf_i386_adjust_dynamic_symbol): Also allocate copy relocs for
PIE and R_386_GOTOFF.
(elf_i386_relocate_section): Allow R_386_GOTOFF in executable.
ld/testsuite/
PR ld/18289
* ld-i386/copyreloc-lib.c: New file.
* ld-i386/copyreloc-main.S: Likewise.
* ld-i386/copyreloc-main.out: Likewise.
* ld-i386/copyreloc-main1.rd: Likewise.
* ld-i386/copyreloc-main2.rd: Likewise.
* ld-i386/dummy.c: Likewise.
* ld-i386/pr17689.out: Likewise.
* ld-i386/pr17689.rd: Likewise.
* ld-i386/pr17689a.c: Likewise.
* ld-i386/pr17689b.S: Likewise.
* ld-i386/pr17827.rd: Likewise.
* ld-i386/pr17827ver.rd: Likewise.
* ld-i386/i386.exp: Run copyreloc tests.
Diffstat (limited to 'ld/testsuite/ld-i386/pr17689b.S')
-rw-r--r-- | ld/testsuite/ld-i386/pr17689b.S | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/ld/testsuite/ld-i386/pr17689b.S b/ld/testsuite/ld-i386/pr17689b.S new file mode 100644 index 0000000..24daf36 --- /dev/null +++ b/ld/testsuite/ld-i386/pr17689b.S @@ -0,0 +1,44 @@ + .text + .globl main + .type main, @function +main: + leal 4(%esp), %ecx + andl $-16, %esp + pushl -4(%ecx) + pushl %ebp + movl %esp, %ebp + pushl %ebx + pushl %ecx + call __x86.get_pc_thunk.bx + addl $_GLOBAL_OFFSET_TABLE_, %ebx + subl $12, %esp + pushl bar_alias@GOTOFF(%ebx) + call foo@PLT + popl %eax + movl ptr@GOTOFF(%ebx), %eax + pushl (%eax) + call foo@PLT + addl $16, %esp + leal -8(%ebp), %esp + xorl %eax, %eax + popl %ecx + popl %ebx + popl %ebp + leal -4(%ecx), %esp + ret + .size main, .-main + .globl ptr + .section .data.rel.local,"aw",@progbits + .align 4 + .type ptr, @object + .size ptr, 4 +ptr: + .long bar_alias + .section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat + .globl __x86.get_pc_thunk.bx + .hidden __x86.get_pc_thunk.bx + .type __x86.get_pc_thunk.bx, @function +__x86.get_pc_thunk.bx: + movl (%esp), %ebx + ret + .section .note.GNU-stack,"",@progbits |