aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-i386/pr17689b.S
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-04-22 05:24:54 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-04-22 05:30:01 -0700
commitd5597ebccca6761fb641b7fc99b6e8b56fbac6e2 (patch)
treea70a40f8a62dc7d494881f71041791e753e8d942 /ld/testsuite/ld-i386/pr17689b.S
parent712e55b92481d89d01877a0668d8140029feca88 (diff)
downloadbinutils-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.S44
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