diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-01-10 13:31:59 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-01-13 08:23:22 -0800 |
commit | 326e3a04a5fa4fbf85b4cc4188a355d2715e5d17 (patch) | |
tree | 13daaec76595140bccafbe14e2302cf715773cd6 /ld/testsuite/ld-i386 | |
parent | cd3ffd4ed23eeb517f28c7c761e1f2def6268ca2 (diff) | |
download | gdb-326e3a04a5fa4fbf85b4cc4188a355d2715e5d17.zip gdb-326e3a04a5fa4fbf85b4cc4188a355d2715e5d17.tar.gz gdb-326e3a04a5fa4fbf85b4cc4188a355d2715e5d17.tar.bz2 |
i386/x86-64: Add unwind info for .plt.got section
When there are both PLT and GOT references to the same function symbol,
linker combines GOTPLT and GOT slots into a single GOT slot and create
an entry in .plt.got section for PLT access via the GOT slot. This
patch adds unwind info for .plt.got section and places .plt.got section
after .plt section for x32. .eh_frame section covering PLT sections
should be aligned to 4 bytes for i386 and x32.
bfd/
2017-01-13 H.J. Lu <hongjiu.lu@intel.com>
Backport from master
2017-01-10 H.J. Lu <hongjiu.lu@intel.com>
* elf32-i386.c (elf_i386_check_relocs): Align .eh_frame section
to 4 bytes.
* elf64-x86-64.c (elf_x86_64_create_dynamic_sections): Align
.eh_frame section to 4 bytes for x32.
(elf_x86_64_check_relocs): Likewise.
2017-01-10 H.J. Lu <hongjiu.lu@intel.com>
PR ld/20830
* elf32-i386.c (elf_i386_eh_frame_plt_got): New.
(PLT_GOT_FDE_LENGTH): Likewise.
(elf_i386_plt_layout): Add eh_frame_plt_got and
eh_frame_plt_got_size.
(elf_i386_plt): Updated.
(elf_i386_link_hash_table): Add plt_got_eh_frame.
(elf_i386_check_relocs): Create .eh_frame section for .plt.got.
(elf_i386_size_dynamic_sections): Allocate and initialize
.eh_frame section for .plt.got.
(elf_i386_finish_dynamic_sections): Adjust .eh_frame section for
.plt.got.
(elf_i386_nacl_plt): Add FIXME for eh_frame_plt_got and
eh_frame_plt_got_size.
* elf64-x86-64.c (elf_x86_64_eh_frame_plt_got): New.
(PLT_GOT_FDE_LENGTH): Likewise.
(elf_x86_64_backend_data): Add eh_frame_plt_got and
eh_frame_plt_got_size.
(elf_x86_64_arch_bed): Updated.
(elf_x86_64_bnd_arch_bed): Add FIXME for eh_frame_plt_got and
eh_frame_plt_got_size.
(elf_x86_64_nacl_arch_bed): Likewise.
(elf_x86_64_link_hash_table): Add plt_got_eh_frame.
(elf_x86_64_check_relocs): Create .eh_frame section for .plt.got.
(elf_x86_64_size_dynamic_sections): Allocate and initialize
.eh_frame section for .plt.got.
(elf_x86_64_finish_dynamic_sections): Adjust .eh_frame section
for .plt.got.
ld/
2017-01-13 H.J. Lu <hongjiu.lu@intel.com>
Backport from master
2017-01-10 H.J. Lu <hongjiu.lu@intel.com>
* testsuite/ld-x86-64/pr20830b.d: Updated.
2017-01-10 H.J. Lu <hongjiu.lu@intel.com>
* emulparams/elf32_x86_64.sh (TINY_READONLY_SECTION): New.
* testsuite/ld-x86-64/pr20830.d: Renamed to ...
* testsuite/ld-x86-64/pr20830a.d: This. Updated.
* testsuite/ld-x86-64/pr20830b.d: New file.
* testsuite/ld-x86-64/x86-64.exp: Rename pr20830 to pr20830a.
Run pr20830b.
2017-01-10 H.J. Lu <hongjiu.lu@intel.com>
PR ld/20830
* testsuite/ld-i386/i386.exp: Run pr20830.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
* testsuite/ld-i386/pr20830.d: New file.
* testsuite/ld-i386/pr20830.s: Likewise.
* testsuite/ld-x86-64/pr20830.d: Likewise.
* testsuite/ld-x86-64/pr20830.s: Likewise.
Diffstat (limited to 'ld/testsuite/ld-i386')
-rw-r--r-- | ld/testsuite/ld-i386/i386.exp | 1 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/pr20830.d | 60 | ||||
-rw-r--r-- | ld/testsuite/ld-i386/pr20830.s | 8 |
3 files changed, 69 insertions, 0 deletions
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index e748e8b..f439411 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -864,3 +864,4 @@ if { !([istarget "i?86-*-linux*"] # Linux only tests run_dump_test "pltgot-1" run_dump_test "pltgot-2" +run_dump_test "pr20830" diff --git a/ld/testsuite/ld-i386/pr20830.d b/ld/testsuite/ld-i386/pr20830.d new file mode 100644 index 0000000..caaadd7 --- /dev/null +++ b/ld/testsuite/ld-i386/pr20830.d @@ -0,0 +1,60 @@ +#name: PR ld/20830 (.plt.got) +#as: --32 +#ld: -melf_i386 -shared -z relro --ld-generated-unwind-info +#objdump: -dw -Wf + +.*: +file format .* + +Contents of the .eh_frame section: + +0+ 00000014 00000000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -4 + Return address column: 8 + Augmentation data: 1b + + DW_CFA_def_cfa: r4 \(esp\) ofs 4 + DW_CFA_offset: r8 \(eip\) at cfa-4 + DW_CFA_nop + DW_CFA_nop + +0+18 00000010 0000001c FDE cie=00000000 pc=00000188..00000193 + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + +0+2c 00000020 00000030 FDE cie=00000000 pc=00000170..00000180 + DW_CFA_def_cfa_offset: 8 + DW_CFA_advance_loc: 6 to 00000176 + DW_CFA_def_cfa_offset: 12 + DW_CFA_advance_loc: 10 to 00000180 + DW_CFA_def_cfa_expression \(DW_OP_breg4 \(esp\): 4; DW_OP_breg8 \(eip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit11; DW_OP_ge; DW_OP_lit2; DW_OP_shl; DW_OP_plus\) + +0+50 00000010 00000054 FDE cie=00000000 pc=00000180..00000188 + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + + +Disassembly of section .plt: + +0+170 <.plt>: + +[a-f0-9]+: ff b3 04 00 00 00 pushl 0x4\(%ebx\) + +[a-f0-9]+: ff a3 08 00 00 00 jmp \*0x8\(%ebx\) + +[a-f0-9]+: 00 00 add %al,\(%eax\) + ... + +Disassembly of section .plt.got: + +0+180 <.plt.got>: + +[a-f0-9]+: ff a3 fc ff ff ff jmp \*-0x4\(%ebx\) + +[a-f0-9]+: 66 90 xchg %ax,%ax + +Disassembly of section .text: + +0+188 <foo>: + +[a-f0-9]+: e8 f3 ff ff ff call 180 <.plt.got> + +[a-f0-9]+: 8b 83 fc ff ff ff mov -0x4\(%ebx\),%eax +#pass diff --git a/ld/testsuite/ld-i386/pr20830.s b/ld/testsuite/ld-i386/pr20830.s new file mode 100644 index 0000000..344a137 --- /dev/null +++ b/ld/testsuite/ld-i386/pr20830.s @@ -0,0 +1,8 @@ + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + call func@plt + movl func@GOT(%ebx), %eax + .cfi_endproc |