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-10 13:31:59 -0800 |
commit | fff53daefb7838b5718422c87946330e4a8288ce (patch) | |
tree | 5f78be197c91e52a9cb9aa373c37ece6d77a1527 /ld/testsuite | |
parent | 5edad15d7c1e6a2409102b3426b444d6ea98bdfc (diff) | |
download | gdb-fff53daefb7838b5718422c87946330e4a8288ce.zip gdb-fff53daefb7838b5718422c87946330e4a8288ce.tar.gz gdb-fff53daefb7838b5718422c87946330e4a8288ce.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.
bfd/
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/
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')
-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 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/pr20830.d | 71 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/pr20830.s | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-x86-64/x86-64.exp | 1 |
6 files changed, 149 insertions, 0 deletions
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 973a110..43cb3c5 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 diff --git a/ld/testsuite/ld-x86-64/pr20830.d b/ld/testsuite/ld-x86-64/pr20830.d new file mode 100644 index 0000000..2dc0f30 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr20830.d @@ -0,0 +1,71 @@ +#name: PR ld/20830 (.plt.got) +#as: --64 +#ld: -melf_x86_64 -shared -z relro --ld-generated-unwind-info +#objdump: -dw -Wf + +.*: +file format .* + +Contents of the .eh_frame section: + +0+ 0000000000000014 00000000 CIE + Version: 1 + Augmentation: "zR" + Code alignment factor: 1 + Data alignment factor: -8 + Return address column: 16 + Augmentation data: 1b + + DW_CFA_def_cfa: r7 \(rsp\) ofs 8 + DW_CFA_offset: r16 \(rip\) at cfa-8 + DW_CFA_nop + DW_CFA_nop + +0+18 0000000000000014 0000001c FDE cie=00000000 pc=0000000000000238..0000000000000244 + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + +0+30 0000000000000024 00000034 FDE cie=00000000 pc=0000000000000220..0000000000000230 + DW_CFA_def_cfa_offset: 16 + DW_CFA_advance_loc: 6 to 0000000000000226 + DW_CFA_def_cfa_offset: 24 + DW_CFA_advance_loc: 10 to 0000000000000230 + DW_CFA_def_cfa_expression \(DW_OP_breg7 \(rsp\): 8; DW_OP_breg16 \(rip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit11; DW_OP_ge; DW_OP_lit3; DW_OP_shl; DW_OP_plus\) + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + +0+58 0000000000000014 0000005c FDE cie=00000000 pc=0000000000000230..0000000000000238 + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + + +Disassembly of section .plt: + +0+220 <.plt>: + +[a-f0-9]+: ff 35 e2 0d 20 00 pushq 0x200de2\(%rip\) # 201008 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: ff 25 e4 0d 20 00 jmpq \*0x200de4\(%rip\) # 201010 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 40 00 nopl 0x0\(%rax\) + +Disassembly of section .plt.got: + +0+230 <.plt.got>: + +[a-f0-9]+: ff 25 c2 0d 20 00 jmpq \*0x200dc2\(%rip\) # 200ff8 <func> + +[a-f0-9]+: 66 90 xchg %ax,%ax + +Disassembly of section .text: + +0+238 <foo>: + +[a-f0-9]+: e8 f3 ff ff ff callq 230 <.plt.got> + +[a-f0-9]+: 48 8b 05 b4 0d 20 00 mov 0x200db4\(%rip\),%rax # 200ff8 <func> +#pass diff --git a/ld/testsuite/ld-x86-64/pr20830.s b/ld/testsuite/ld-x86-64/pr20830.s new file mode 100644 index 0000000..d9a1b4c --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr20830.s @@ -0,0 +1,8 @@ + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + call func@plt + movq func@GOTPCREL(%rip), %rax + .cfi_endproc diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 26d739e..878e28e 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -1019,3 +1019,4 @@ if { ![istarget "x86_64-*-linux*"]} { run_dump_test "pr17618" run_dump_test "pltgot-1" run_dump_test "pltgot-2" +run_dump_test "pr20830" |