diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-05-08 12:24:11 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-05-08 12:24:29 -0700 |
commit | 38b123494b38ae09168387c0502acd1f23c1b601 (patch) | |
tree | 723d1c636b173f5d94346879cefaa4c2b2bb5f68 /ld | |
parent | d7ab4911f8aa3e1cd06ece40f74d0b4a532d6a10 (diff) | |
download | gdb-38b123494b38ae09168387c0502acd1f23c1b601.zip gdb-38b123494b38ae09168387c0502acd1f23c1b601.tar.gz gdb-38b123494b38ae09168387c0502acd1f23c1b601.tar.bz2 |
x86-64: Improve PLT generation and synthetic PLT symbols
On x86-64, the procedure linkage table (PLT) is used to
1. Call external function.
2. Call internal IFUNC function. The best implementation is selected
for the target processor at run-time.
3. Act as the canonical function address.
4. Support LD_AUDIT to audit external function calls.
5. Support LD_PROFILE to profile external function calls.
PLT looks like:
PLT0: push GOT[1]
jmp *GOT[2]
nop
PLT1: jmp *GOT[name1_index]
push name1_reloc_index
jmp PLT0
GOT is an array of addresses. Initially the GOT entry of name1 is
filled with the address of the "push name1_reloc_index" instruction.
The function, name1, is called via "jmp *GOT[name1]" in the PLT entry.
Even when lazy binding is disabled by "-z now", the PLT0 entry may
still be used with LD_AUDIT or LD_PROFILE if PLT entry is used for
canonical function address.
When linker is invoked with "-z bndplt", a different PLT layout in .plt
is used:
PLT0: push GOT[1]
bnd jmp *GOT[2]
nop
PLT1: push name1_reloc_index
bnd jmp PLT0
nop
together with a second PLT section, .pl.bnd:
PLT1: bnd jmp *GOT[name1_index]
nop
where the GOT entry of name1 is filled with the address of the push
instruction of the corresponding entry in .plt.
1. With lazy binding, when the external function, name1, is called the
first time, dynamic linker is called via PLT0 to update GOT[name1_index]
with the actual address of name1 and transfers control to name1
afterwards.
2. PLT is also used to call a local IFUNC function, name1, run-time
loader updates GOT[name1_index] when loading the module.
This patch
1. Remove PLT layout configurations from x86-64 backend_data.
2. Add generic, lay and non-lazy PLT layout configurations to x86-64
link_hash_table. Generic PLT layout includes the PLT entry templates,
information how to update the first instruction in PLT and PLT eh_frame
informaton, which are initialized in x86-64 setup_gnu_properties, based
on "-z bndplt" and target selection. PLT section alignment is also set
to PLT entry size for non-NaCl target.
3. Remove elf_x86_64_create_dynamic_sections. create_dynamic_sections
isn't always called, but GOT relocations need GOT relocations. Instead,
create all x86-64 specific dynamic sections with alignment to their entry
size in x86-64 setup_gnu_properties, which initializes elf.dynobj, so
that x86-64 check_relocs can be simplified.
4. Rewrite elf_x86_64_get_synthetic_symtab to check PLT sections against
all dynamic relocations to support both lazy and non-lazy PLTs.
There is no change in PLT. The only externally visible change is the
improvement of synthetic PLT symbols for .plt.got.
bfd/
* elf64-x86-64.c (PLT_ENTRY_SIZE): Renamed to ...
(LAZY_PLT_ENTRY_SIZE): This.
(NON_LAZY_PLT_ENTRY_SIZE): New.
(elf_x86_64_plt0_entry): Renamed to ...
(elf_x86_64_lazy_plt0_entry): This.
(elf_x86_64_plt_entry): Renamed to ...
(elf_x86_64_lazy_plt_entry): This.
(elf_x86_64_bnd_plt0_entry): Renamed to ...
(elf_x86_64_lazy_bnd_plt0_entry): This.
(elf_x86_64_legacy_plt_entry): Removed.
(elf_x86_64_bnd_plt_entry): Renamed to ...
(elf_x86_64_lazy_bnd_plt_entry): This.
(elf_x86_64_legacy_plt2_entry): Renamed to ...
(elf_x86_64_non_lazy_plt_entry): This.
(elf_x86_64_bnd_plt2_entry): Renamed to ...
(elf_x86_64_non_lazy_bnd_plt_entry): This.
(elf_x86_64_eh_frame_plt): Renamed to ...
(elf_x86_64_eh_frame_lazy_plt): This.
(elf_x86_64_eh_frame_bnd_plt): Renamed to ...
(elf_x86_64_eh_frame_lazy_bnd_plt): This.
(elf_x86_64_eh_frame_plt_got): Renamed to ...
(elf_x86_64_eh_frame_non_lazy_plt): This.
(elf_x86_64_lazy_plt_layout): New.
(elf_x86_64_non_lazy_plt_layout): Likewise.
(elf_x86_64_plt_layout): Likewise.
(elf_x86_64_backend_data): Remove PLT layout information. Add
os for target system.
(GET_PLT_ENTRY_SIZE): Removed.
(elf_x86_64_lazy_plt): New.
(elf_x86_64_non_lazy_plt): Likewise.
(elf_x86_64_lazy_bnd_plt): Likewise.
(elf_x86_64_non_lazy_bnd_plt): Likewise.
(elf_x86-64_arch_bed): Updated.
(elf_x86_64_link_hash_table): Add plt, lazy_plt and non_lazy_plt.
(elf_x86_64_create_dynamic_sections): Removed.
(elf_x86_64_check_relocs): Don't check elf.dynobj. Don't call
_bfd_elf_create_ifunc_sections nor _bfd_elf_create_got_section.
(elf_x86-64_adjust_dynamic_symbol): Updated.
(elf_x86_64_allocate_dynrelocs): Updated. Pass 0 as PLT header
size to _bfd_elf_allocate_ifunc_dyn_relocs and don't allocate
size for PLT0 if there is no PLT0. Get plt_entry_size from
non_lazy_plt for non-lazy PLT entries.
(elf_x86_64_size_dynamic_sections): Updated. Get plt_entry_size
from non_lazy_plt for non-lazy PLT entries.
(elf_x86-64_relocate_section): Updated. Properly get PLT index
if there is no PLT0.
(elf_x86_64_finish_dynamic_symbol): Updated. Fill the first slot
in the PLT entry with generic PLT layout. Fill the non-lazy PLT
entries with non-lazy PLT layout. Don't fill the second and third
slots in the PLT entry if there is no PLT0.
(elf_x86_64_finish_dynamic_sections): Updated. Don't fill PLT0
if there is no PLT0. Set sh_entsize on the .plt.got section.
(compare_relocs): New.
(elf_x86_64_plt_type): Likewise.
(elf_x86_64_plt): Likewise.
(elf_x86_64_nacl_plt): New. Forward declaration.
(elf_x86_64_get_plt_sym_val): Removed.
(elf_x86_64_get_synthetic_symtab): Rewrite to check PLT sections
against all dynamic relocations.
(elf_x86_64_link_setup_gnu_properties): New function.
(elf_backend_create_dynamic_sections): Updated.
(elf_backend_setup_gnu_properties): New.
(elf_x86_64_nacl_plt): New.
(elf_x86_64_nacl_arch_bed): Updated.
ld/
* testsuite/ld-ifunc/ifunc-16-x86-64-now.d: New file.
* testsuite/ld-ifunc/ifunc-2-local-x86-64-now.d: Likewise.
* testsuite/ld-ifunc/ifunc-2-x86-64-now.d: Likewise.
* testsuite/ld-ifunc/pr17154-x86-64-now.d: Likewise.
* testsuite/ld-x86-64/bnd-branch-1-now.d: Likewise.
* testsuite/ld-x86-64/bnd-ifunc-1-now.d: Likewise.
* testsuite/ld-x86-64/bnd-ifunc-2-now.d: Likewise.
* testsuite/ld-x86-64/bnd-plt-1-now.d: Likewise.
* testsuite/ld-x86-64/mpx3n.dd: Likewise.
* testsuite/ld-x86-64/mpx4n.dd: Likewise.
* testsuite/ld-x86-64/plt-main-bnd-now.rd: Likewise.
* testsuite/ld-x86-64/plt2.dd: Likewise.
* testsuite/ld-x86-64/plt2.rd: Likewise.
* testsuite/ld-x86-64/plt2.s: Likewise.
* testsuite/ld-x86-64/pr20830a-now.d: Likewise.
* testsuite/ld-x86-64/pr20830b-now.d: Likewise.
* testsuite/ld-x86-64/pr21038a-now.d: Likewise.
* testsuite/ld-x86-64/pr21038b-now.d: Likewise.
* testsuite/ld-x86-64/pr21038c-now.d: Likewise.
* testsuite/ld-x86-64/load1b-nacl.d: Updated.
* testsuite/ld-x86-64/load1b.d: Likewise.
* testsuite/ld-x86-64/plt-main-bnd.dd: Likewise.
* testsuite/ld-x86-64/pr20253-1h.d: Likewise.
* testsuite/ld-x86-64/pr20830a.d: Update the .plt.got section
with func@plt.
* testsuite/ld-x86-64/pr20830b.d: Likewise.
* testsuite/ld-x86-64/pr21038a.d: Likewise.
* testsuite/ld-x86-64/pr21038c.d: Likewise.
* testsuite/ld-x86-64/mpx.exp: Add some -z now tests.
* testsuite/ld-x86-64/x86-64.exp: Likewise.
Diffstat (limited to 'ld')
30 files changed, 948 insertions, 91 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index c56b3db..e057b4d 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,38 @@ 2017-05-08 H.J. Lu <hongjiu.lu@intel.com> + * testsuite/ld-ifunc/ifunc-16-x86-64-now.d: New file. + * testsuite/ld-ifunc/ifunc-2-local-x86-64-now.d: Likewise. + * testsuite/ld-ifunc/ifunc-2-x86-64-now.d: Likewise. + * testsuite/ld-ifunc/pr17154-x86-64-now.d: Likewise. + * testsuite/ld-x86-64/bnd-branch-1-now.d: Likewise. + * testsuite/ld-x86-64/bnd-ifunc-1-now.d: Likewise. + * testsuite/ld-x86-64/bnd-ifunc-2-now.d: Likewise. + * testsuite/ld-x86-64/bnd-plt-1-now.d: Likewise. + * testsuite/ld-x86-64/mpx3n.dd: Likewise. + * testsuite/ld-x86-64/mpx4n.dd: Likewise. + * testsuite/ld-x86-64/plt-main-bnd-now.rd: Likewise. + * testsuite/ld-x86-64/plt2.dd: Likewise. + * testsuite/ld-x86-64/plt2.rd: Likewise. + * testsuite/ld-x86-64/plt2.s: Likewise. + * testsuite/ld-x86-64/pr20830a-now.d: Likewise. + * testsuite/ld-x86-64/pr20830b-now.d: Likewise. + * testsuite/ld-x86-64/pr21038a-now.d: Likewise. + * testsuite/ld-x86-64/pr21038b-now.d: Likewise. + * testsuite/ld-x86-64/pr21038c-now.d: Likewise. + * testsuite/ld-x86-64/load1b-nacl.d: Updated. + * testsuite/ld-x86-64/load1b.d: Likewise. + * testsuite/ld-x86-64/plt-main-bnd.dd: Likewise. + * testsuite/ld-x86-64/pr20253-1h.d: Likewise. + * testsuite/ld-x86-64/pr20830a.d: Update the .plt.got section + with func@plt. + * testsuite/ld-x86-64/pr20830b.d: Likewise. + * testsuite/ld-x86-64/pr21038a.d: Likewise. + * testsuite/ld-x86-64/pr21038c.d: Likewise. + * testsuite/ld-x86-64/mpx.exp: Add some -z now tests. + * testsuite/ld-x86-64/x86-64.exp: Likewise. + +2017-05-08 H.J. Lu <hongjiu.lu@intel.com> + * testsuite/ld-i386/i386.exp: Add some -z now tests. * testsuite/ld-i386/plt-pic2.dd: New file. * testsuite/ld-i386/plt2.dd: Likewise. diff --git a/ld/testsuite/ld-ifunc/ifunc-16-x86-64-now.d b/ld/testsuite/ld-ifunc/ifunc-16-x86-64-now.d new file mode 100644 index 0000000..acc5093 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-16-x86-64-now.d @@ -0,0 +1,14 @@ +#source: ifunc-16-x86.s +#as: --64 +#ld: -z now -shared -melf_x86_64 +#readelf: -r --wide +#target: x86_64-*-* +#notarget: x86_64-*-nacl* + +Relocation section '.rela.dyn' at .* +[ ]+Offset[ ]+Info[ ]+Type[ ]+.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_GLOB_DAT[ ]+0+[ ]+ifunc \+ 0 + +Relocation section '.rela.plt' at .* +[ ]+Offset[ ]+Info[ ]+Type[ ]+.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* diff --git a/ld/testsuite/ld-ifunc/ifunc-2-local-x86-64-now.d b/ld/testsuite/ld-ifunc/ifunc-2-local-x86-64-now.d new file mode 100644 index 0000000..6ec199f --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-2-local-x86-64-now.d @@ -0,0 +1,32 @@ +#source: ifunc-2-local-x86-64.s +#as: --64 +#ld: -z now -shared -melf_x86_64 +#objdump: -dw +#target: x86_64-*-* +#notarget: x86_64-*-nacl* + +.*: +file format .* + + +Disassembly of section .plt: + +0+1f0 <.plt>: + +[a-f0-9]+: ff 35 42 01 20 00 pushq 0x200142\(%rip\) # 200338 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: ff 25 44 01 20 00 jmpq \*0x200144\(%rip\) # 200340 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 40 00 nopl 0x0\(%rax\) + +0+200 <\*ABS\*\+0x210@plt>: + +[a-f0-9]+: ff 25 42 01 20 00 jmpq \*0x200142\(%rip\) # 200348 <_GLOBAL_OFFSET_TABLE_\+0x18> + +[a-f0-9]+: 68 00 00 00 00 pushq \$0x0 + +[a-f0-9]+: e9 e0 ff ff ff jmpq 1f0 <.plt> + +Disassembly of section .text: + +0+210 <foo>: + +[a-f0-9]+: c3 retq + +0+211 <bar>: + +[a-f0-9]+: e8 ea ff ff ff callq 200 <\*ABS\*\+0x210@plt> + +[a-f0-9]+: 48 8d 05 e3 ff ff ff lea -0x1d\(%rip\),%rax # 200 <\*ABS\*\+0x210@plt> + +[a-f0-9]+: c3 retq +#pass diff --git a/ld/testsuite/ld-ifunc/ifunc-2-x86-64-now.d b/ld/testsuite/ld-ifunc/ifunc-2-x86-64-now.d new file mode 100644 index 0000000..95920cc --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-2-x86-64-now.d @@ -0,0 +1,32 @@ +#source: ifunc-2-x86-64.s +#as: --64 +#ld: -z now -shared -melf_x86_64 +#objdump: -dw +#target: x86_64-*-* +#notarget: x86_64-*-nacl* + +.*: +file format .* + + +Disassembly of section .plt: + +0+1f0 <.plt>: + +[a-f0-9]+: ff 35 42 01 20 00 pushq 0x200142\(%rip\) # 200338 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: ff 25 44 01 20 00 jmpq \*0x200144\(%rip\) # 200340 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 40 00 nopl 0x0\(%rax\) + +0+200 <\*ABS\*\+0x210@plt>: + +[a-f0-9]+: ff 25 42 01 20 00 jmpq \*0x200142\(%rip\) # 200348 <_GLOBAL_OFFSET_TABLE_\+0x18> + +[a-f0-9]+: 68 00 00 00 00 pushq \$0x0 + +[a-f0-9]+: e9 e0 ff ff ff jmpq 1f0 <.plt> + +Disassembly of section .text: + +0+210 <foo>: + +[a-f0-9]+: c3 retq + +0+211 <bar>: + +[a-f0-9]+: e8 ea ff ff ff callq 200 <\*ABS\*\+0x210@plt> + +[a-f0-9]+: 48 8d 05 e3 ff ff ff lea -0x1d\(%rip\),%rax # 200 <\*ABS\*\+0x210@plt> + +[a-f0-9]+: c3 retq +#pass diff --git a/ld/testsuite/ld-ifunc/pr17154-x86-64-now.d b/ld/testsuite/ld-ifunc/pr17154-x86-64-now.d new file mode 100644 index 0000000..8c19571 --- /dev/null +++ b/ld/testsuite/ld-ifunc/pr17154-x86-64-now.d @@ -0,0 +1,51 @@ +#source: pr17154-x86.s +#as: --64 +#ld: -z now -shared -melf_x86_64 +#objdump: -dw +#target: x86_64-*-* +#notarget: x86_64-*-nacl* + +.*: +file format .* + + +Disassembly of section .plt: + +0+2b0 <.plt>: + +[a-f0-9]+: ff 35 aa 01 20 00 pushq 0x2001aa\(%rip\) # 200460 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: ff 25 ac 01 20 00 jmpq \*0x2001ac\(%rip\) # 200468 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 40 00 nopl 0x0\(%rax\) + +0+2c0 <\*ABS\*\+0x2fa@plt>: + +[a-f0-9]+: ff 25 aa 01 20 00 jmpq \*0x2001aa\(%rip\) # 200470 <_GLOBAL_OFFSET_TABLE_\+0x18> + +[a-f0-9]+: 68 01 00 00 00 pushq \$0x1 + +[a-f0-9]+: e9 e0 ff ff ff jmpq 2b0 <.plt> + +0+2d0 <\*ABS\*\+0x2f0@plt>: + +[a-f0-9]+: ff 25 a2 01 20 00 jmpq \*0x2001a2\(%rip\) # 200478 <_GLOBAL_OFFSET_TABLE_\+0x20> + +[a-f0-9]+: 68 00 00 00 00 pushq \$0x0 + +[a-f0-9]+: e9 d0 ff ff ff jmpq 2b0 <.plt> + +Disassembly of section .plt.got: + +0+2e0 <func1@plt>: + +[a-f0-9]+: ff 25 62 01 20 00 jmpq \*0x200162\(%rip\) # 200448 <func1> + +[a-f0-9]+: 66 90 xchg %ax,%ax + +0+2e8 <func2@plt>: + +[a-f0-9]+: ff 25 62 01 20 00 jmpq \*0x200162\(%rip\) # 200450 <func2> + +[a-f0-9]+: 66 90 xchg %ax,%ax + +Disassembly of section .text: + +0+2f0 <resolve1>: + +[a-f0-9]+: e8 eb ff ff ff callq 2e0 <func1@plt> + +0+2f5 <g1>: + +[a-f0-9]+: e9 d6 ff ff ff jmpq 2d0 <\*ABS\*\+0x2f0@plt> + +0+2fa <resolve2>: + +[a-f0-9]+: e8 e9 ff ff ff callq 2e8 <func2@plt> + +0+2ff <g2>: + +[a-f0-9]+: e9 bc ff ff ff jmpq 2c0 <\*ABS\*\+0x2fa@plt> +#pass diff --git a/ld/testsuite/ld-x86-64/bnd-branch-1-now.d b/ld/testsuite/ld-x86-64/bnd-branch-1-now.d new file mode 100644 index 0000000..b4cd71f --- /dev/null +++ b/ld/testsuite/ld-x86-64/bnd-branch-1-now.d @@ -0,0 +1,43 @@ +#source: bnd-branch-1.s +#as: --64 +#ld: -z now -shared -melf_x86_64 +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .plt: + +0+290 <.plt>: + +[a-f0-9]+: ff 35 82 01 20 00 pushq 0x200182\(%rip\) # 200418 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: ff 25 84 01 20 00 jmpq \*0x200184\(%rip\) # 200420 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 40 00 nopl 0x0\(%rax\) + +Disassembly of section .plt.got: + +0+2a0 <foo2@plt>: + +[a-f0-9]+: ff 25 4a 01 20 00 jmpq \*0x20014a\(%rip\) # 2003f0 <foo2> + +[a-f0-9]+: 66 90 xchg %ax,%ax + +0+2a8 <foo3@plt>: + +[a-f0-9]+: ff 25 4a 01 20 00 jmpq \*0x20014a\(%rip\) # 2003f8 <foo3> + +[a-f0-9]+: 66 90 xchg %ax,%ax + +0+2b0 <foo1@plt>: + +[a-f0-9]+: ff 25 4a 01 20 00 jmpq \*0x20014a\(%rip\) # 200400 <foo1> + +[a-f0-9]+: 66 90 xchg %ax,%ax + +0+2b8 <foo4@plt>: + +[a-f0-9]+: ff 25 4a 01 20 00 jmpq \*0x20014a\(%rip\) # 200408 <foo4> + +[a-f0-9]+: 66 90 xchg %ax,%ax + +Disassembly of section .text: + +0+2c0 <_start>: + +[a-f0-9]+: f2 e9 ea ff ff ff bnd jmpq 2b0 <foo1@plt> + +[a-f0-9]+: e8 d5 ff ff ff callq 2a0 <foo2@plt> + +[a-f0-9]+: e9 d8 ff ff ff jmpq 2a8 <foo3@plt> + +[a-f0-9]+: e8 e3 ff ff ff callq 2b8 <foo4@plt> + +[a-f0-9]+: f2 e8 cd ff ff ff bnd callq 2a8 <foo3@plt> + +[a-f0-9]+: e9 d8 ff ff ff jmpq 2b8 <foo4@plt> +#pass diff --git a/ld/testsuite/ld-x86-64/bnd-ifunc-1-now.d b/ld/testsuite/ld-x86-64/bnd-ifunc-1-now.d new file mode 100644 index 0000000..723f960 --- /dev/null +++ b/ld/testsuite/ld-x86-64/bnd-ifunc-1-now.d @@ -0,0 +1,33 @@ +#source: bnd-ifunc-1.s +#as: --64 -madd-bnd-prefix +#ld: -z now -shared -melf_x86_64 -z bndplt +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .plt: + +0+1f0 <.plt>: + +[a-f0-9]+: ff 35 4a 01 20 00 pushq 0x20014a\(%rip\) # 200340 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: f2 ff 25 4b 01 20 00 bnd jmpq \*0x20014b\(%rip\) # 200348 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 00 nopl \(%rax\) + +[a-f0-9]+: 68 00 00 00 00 pushq \$0x0 + +[a-f0-9]+: f2 e9 e5 ff ff ff bnd jmpq 1f0 <.plt> + +[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) + +Disassembly of section .plt.bnd: + +0+210 <\*ABS\*\+0x218@plt>: + +[a-f0-9]+: f2 ff 25 39 01 20 00 bnd jmpq \*0x200139\(%rip\) # 200350 <_GLOBAL_OFFSET_TABLE_\+0x18> + +[a-f0-9]+: 90 nop + +Disassembly of section .text: + +0+218 <foo>: + +[a-f0-9]+: f2 c3 bnd retq + +0+21a <bar>: + +[a-f0-9]+: f2 e8 f0 ff ff ff bnd callq 210 <\*ABS\*\+0x218@plt> + +[a-f0-9]+: f2 c3 bnd retq +#pass diff --git a/ld/testsuite/ld-x86-64/bnd-ifunc-2-now.d b/ld/testsuite/ld-x86-64/bnd-ifunc-2-now.d new file mode 100644 index 0000000..a9dd968 --- /dev/null +++ b/ld/testsuite/ld-x86-64/bnd-ifunc-2-now.d @@ -0,0 +1,55 @@ +#source: bnd-ifunc-2.s +#as: --64 -madd-bnd-prefix +#ld: -z now -shared -melf_x86_64 -z bndplt +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .plt: + +0+2b0 <.plt>: + +[a-f0-9]+: ff 35 ba 01 20 00 pushq 0x2001ba\(%rip\) # 200470 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: f2 ff 25 bb 01 20 00 bnd jmpq \*0x2001bb\(%rip\) # 200478 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 00 nopl \(%rax\) + +[a-f0-9]+: 68 01 00 00 00 pushq \$0x1 + +[a-f0-9]+: f2 e9 e5 ff ff ff bnd jmpq 2b0 <.plt> + +[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) + +[a-f0-9]+: 68 00 00 00 00 pushq \$0x0 + +[a-f0-9]+: f2 e9 d5 ff ff ff bnd jmpq 2b0 <.plt> + +[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) + +Disassembly of section .plt.got: + +0+2e0 <func1@plt>: + +[a-f0-9]+: f2 ff 25 71 01 20 00 bnd jmpq \*0x200171\(%rip\) # 200458 <func1> + +[a-f0-9]+: 90 nop + +0+2e8 <func2@plt>: + +[a-f0-9]+: f2 ff 25 71 01 20 00 bnd jmpq \*0x200171\(%rip\) # 200460 <func2> + +[a-f0-9]+: 90 nop + +Disassembly of section .plt.bnd: + +0+2f0 <\*ABS\*\+0x30c@plt>: + +[a-f0-9]+: f2 ff 25 89 01 20 00 bnd jmpq \*0x200189\(%rip\) # 200480 <_GLOBAL_OFFSET_TABLE_\+0x18> + +[a-f0-9]+: 90 nop + +0+2f8 <\*ABS\*\+0x300@plt>: + +[a-f0-9]+: f2 ff 25 89 01 20 00 bnd jmpq \*0x200189\(%rip\) # 200488 <_GLOBAL_OFFSET_TABLE_\+0x20> + +[a-f0-9]+: 90 nop + +Disassembly of section .text: + +0+300 <resolve1>: + +[a-f0-9]+: f2 e8 da ff ff ff bnd callq 2e0 <func1@plt> + +0+306 <g1>: + +[a-f0-9]+: f2 e9 ec ff ff ff bnd jmpq 2f8 <\*ABS\*\+0x300@plt> + +0+30c <resolve2>: + +[a-f0-9]+: f2 e8 d6 ff ff ff bnd callq 2e8 <func2@plt> + +0+312 <g2>: + +[a-f0-9]+: f2 e9 d8 ff ff ff bnd jmpq 2f0 <\*ABS\*\+0x30c@plt> +#pass diff --git a/ld/testsuite/ld-x86-64/bnd-plt-1-now.d b/ld/testsuite/ld-x86-64/bnd-plt-1-now.d new file mode 100644 index 0000000..f2932c7 --- /dev/null +++ b/ld/testsuite/ld-x86-64/bnd-plt-1-now.d @@ -0,0 +1,43 @@ +#source: bnd-branch-1.s +#as: --64 +#ld: -z now -shared -melf_x86_64 -z bndplt +#objdump: -dw + +.*: +file format .* + + +Disassembly of section .plt: + +0+290 <.plt>: + +[a-f0-9]+: ff 35 82 01 20 00 pushq 0x200182\(%rip\) # 200418 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: f2 ff 25 83 01 20 00 bnd jmpq \*0x200183\(%rip\) # 200420 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 00 nopl \(%rax\) + +Disassembly of section .plt.got: + +0+2a0 <foo2@plt>: + +[a-f0-9]+: f2 ff 25 49 01 20 00 bnd jmpq \*0x200149\(%rip\) # 2003f0 <foo2> + +[a-f0-9]+: 90 nop + +0+2a8 <foo3@plt>: + +[a-f0-9]+: f2 ff 25 49 01 20 00 bnd jmpq \*0x200149\(%rip\) # 2003f8 <foo3> + +[a-f0-9]+: 90 nop + +0+2b0 <foo1@plt>: + +[a-f0-9]+: f2 ff 25 49 01 20 00 bnd jmpq \*0x200149\(%rip\) # 200400 <foo1> + +[a-f0-9]+: 90 nop + +0+2b8 <foo4@plt>: + +[a-f0-9]+: f2 ff 25 49 01 20 00 bnd jmpq \*0x200149\(%rip\) # 200408 <foo4> + +[a-f0-9]+: 90 nop + +Disassembly of section .text: + +0+2c0 <_start>: + +[a-f0-9]+: f2 e9 ea ff ff ff bnd jmpq 2b0 <foo1@plt> + +[a-f0-9]+: e8 d5 ff ff ff callq 2a0 <foo2@plt> + +[a-f0-9]+: e9 d8 ff ff ff jmpq 2a8 <foo3@plt> + +[a-f0-9]+: e8 e3 ff ff ff callq 2b8 <foo4@plt> + +[a-f0-9]+: f2 e8 cd ff ff ff bnd callq 2a8 <foo3@plt> + +[a-f0-9]+: e9 d8 ff ff ff jmpq 2b8 <foo4@plt> +#pass diff --git a/ld/testsuite/ld-x86-64/load1b-nacl.d b/ld/testsuite/ld-x86-64/load1b-nacl.d index b6fa43d..524207d 100644 --- a/ld/testsuite/ld-x86-64/load1b-nacl.d +++ b/ld/testsuite/ld-x86-64/load1b-nacl.d @@ -8,48 +8,48 @@ SYMBOL TABLE: #... -1003008c l O .data 0+1 bar +10030090 l O .data 0+1 bar #... -1003008d g O .data 0+1 foo +10030091 g O .data 0+1 foo #... Disassembly of section .text: 0+20000 <_start>: -[ ]*[a-f0-9]+: 81 d0 8c 00 03 10 adc \$0x1003008c,%eax -[ ]*[a-f0-9]+: 81 c3 8c 00 03 10 add \$0x1003008c,%ebx -[ ]*[a-f0-9]+: 81 e1 8c 00 03 10 and \$0x1003008c,%ecx -[ ]*[a-f0-9]+: 81 fa 8c 00 03 10 cmp \$0x1003008c,%edx -[ ]*[a-f0-9]+: 81 ce 8c 00 03 10 or \$0x1003008c,%esi -[ ]*[a-f0-9]+: 81 df 8c 00 03 10 sbb \$0x1003008c,%edi -[ ]*[a-f0-9]+: 81 ed 8c 00 03 10 sub \$0x1003008c,%ebp -[ ]*[a-f0-9]+: 41 81 f0 8c 00 03 10 xor \$0x1003008c,%r8d -[ ]*[a-f0-9]+: 41 f7 c7 8c 00 03 10 test \$0x1003008c,%r15d -[ ]*[a-f0-9]+: 48 81 d0 8c 00 03 10 adc \$0x1003008c,%rax -[ ]*[a-f0-9]+: 48 81 c3 8c 00 03 10 add \$0x1003008c,%rbx -[ ]*[a-f0-9]+: 48 81 e1 8c 00 03 10 and \$0x1003008c,%rcx -[ ]*[a-f0-9]+: 48 81 fa 8c 00 03 10 cmp \$0x1003008c,%rdx -[ ]*[a-f0-9]+: 48 81 cf 8c 00 03 10 or \$0x1003008c,%rdi -[ ]*[a-f0-9]+: 48 81 de 8c 00 03 10 sbb \$0x1003008c,%rsi -[ ]*[a-f0-9]+: 48 81 ed 8c 00 03 10 sub \$0x1003008c,%rbp -[ ]*[a-f0-9]+: 49 81 f0 8c 00 03 10 xor \$0x1003008c,%r8 -[ ]*[a-f0-9]+: 49 f7 c7 8c 00 03 10 test \$0x1003008c,%r15 -[ ]*[a-f0-9]+: 81 d0 8d 00 03 10 adc \$0x1003008d,%eax -[ ]*[a-f0-9]+: 81 c3 8d 00 03 10 add \$0x1003008d,%ebx -[ ]*[a-f0-9]+: 81 e1 8d 00 03 10 and \$0x1003008d,%ecx -[ ]*[a-f0-9]+: 81 fa 8d 00 03 10 cmp \$0x1003008d,%edx -[ ]*[a-f0-9]+: 81 ce 8d 00 03 10 or \$0x1003008d,%esi -[ ]*[a-f0-9]+: 81 df 8d 00 03 10 sbb \$0x1003008d,%edi -[ ]*[a-f0-9]+: 81 ed 8d 00 03 10 sub \$0x1003008d,%ebp -[ ]*[a-f0-9]+: 41 81 f0 8d 00 03 10 xor \$0x1003008d,%r8d -[ ]*[a-f0-9]+: 41 f7 c7 8d 00 03 10 test \$0x1003008d,%r15d -[ ]*[a-f0-9]+: 48 81 d0 8d 00 03 10 adc \$0x1003008d,%rax -[ ]*[a-f0-9]+: 48 81 c3 8d 00 03 10 add \$0x1003008d,%rbx -[ ]*[a-f0-9]+: 48 81 e1 8d 00 03 10 and \$0x1003008d,%rcx -[ ]*[a-f0-9]+: 48 81 fa 8d 00 03 10 cmp \$0x1003008d,%rdx -[ ]*[a-f0-9]+: 48 81 cf 8d 00 03 10 or \$0x1003008d,%rdi -[ ]*[a-f0-9]+: 48 81 de 8d 00 03 10 sbb \$0x1003008d,%rsi -[ ]*[a-f0-9]+: 48 81 ed 8d 00 03 10 sub \$0x1003008d,%rbp -[ ]*[a-f0-9]+: 49 81 f0 8d 00 03 10 xor \$0x1003008d,%r8 -[ ]*[a-f0-9]+: 49 f7 c7 8d 00 03 10 test \$0x1003008d,%r15 + +[a-f0-9]+: 81 d0 90 00 03 10 adc \$0x10030090,%eax + +[a-f0-9]+: 81 c3 90 00 03 10 add \$0x10030090,%ebx + +[a-f0-9]+: 81 e1 90 00 03 10 and \$0x10030090,%ecx + +[a-f0-9]+: 81 fa 90 00 03 10 cmp \$0x10030090,%edx + +[a-f0-9]+: 81 ce 90 00 03 10 or \$0x10030090,%esi + +[a-f0-9]+: 81 df 90 00 03 10 sbb \$0x10030090,%edi + +[a-f0-9]+: 81 ed 90 00 03 10 sub \$0x10030090,%ebp + +[a-f0-9]+: 41 81 f0 90 00 03 10 xor \$0x10030090,%r8d + +[a-f0-9]+: 41 f7 c7 90 00 03 10 test \$0x10030090,%r15d + +[a-f0-9]+: 48 81 d0 90 00 03 10 adc \$0x10030090,%rax + +[a-f0-9]+: 48 81 c3 90 00 03 10 add \$0x10030090,%rbx + +[a-f0-9]+: 48 81 e1 90 00 03 10 and \$0x10030090,%rcx + +[a-f0-9]+: 48 81 fa 90 00 03 10 cmp \$0x10030090,%rdx + +[a-f0-9]+: 48 81 cf 90 00 03 10 or \$0x10030090,%rdi + +[a-f0-9]+: 48 81 de 90 00 03 10 sbb \$0x10030090,%rsi + +[a-f0-9]+: 48 81 ed 90 00 03 10 sub \$0x10030090,%rbp + +[a-f0-9]+: 49 81 f0 90 00 03 10 xor \$0x10030090,%r8 + +[a-f0-9]+: 49 f7 c7 90 00 03 10 test \$0x10030090,%r15 + +[a-f0-9]+: 81 d0 91 00 03 10 adc \$0x10030091,%eax + +[a-f0-9]+: 81 c3 91 00 03 10 add \$0x10030091,%ebx + +[a-f0-9]+: 81 e1 91 00 03 10 and \$0x10030091,%ecx + +[a-f0-9]+: 81 fa 91 00 03 10 cmp \$0x10030091,%edx + +[a-f0-9]+: 81 ce 91 00 03 10 or \$0x10030091,%esi + +[a-f0-9]+: 81 df 91 00 03 10 sbb \$0x10030091,%edi + +[a-f0-9]+: 81 ed 91 00 03 10 sub \$0x10030091,%ebp + +[a-f0-9]+: 41 81 f0 91 00 03 10 xor \$0x10030091,%r8d + +[a-f0-9]+: 41 f7 c7 91 00 03 10 test \$0x10030091,%r15d + +[a-f0-9]+: 48 81 d0 91 00 03 10 adc \$0x10030091,%rax + +[a-f0-9]+: 48 81 c3 91 00 03 10 add \$0x10030091,%rbx + +[a-f0-9]+: 48 81 e1 91 00 03 10 and \$0x10030091,%rcx + +[a-f0-9]+: 48 81 fa 91 00 03 10 cmp \$0x10030091,%rdx + +[a-f0-9]+: 48 81 cf 91 00 03 10 or \$0x10030091,%rdi + +[a-f0-9]+: 48 81 de 91 00 03 10 sbb \$0x10030091,%rsi + +[a-f0-9]+: 48 81 ed 91 00 03 10 sub \$0x10030091,%rbp + +[a-f0-9]+: 49 81 f0 91 00 03 10 xor \$0x10030091,%r8 + +[a-f0-9]+: 49 f7 c7 91 00 03 10 test \$0x10030091,%r15 #pass diff --git a/ld/testsuite/ld-x86-64/load1b.d b/ld/testsuite/ld-x86-64/load1b.d index 8827f38..acbd2fc 100644 --- a/ld/testsuite/ld-x86-64/load1b.d +++ b/ld/testsuite/ld-x86-64/load1b.d @@ -8,49 +8,50 @@ SYMBOL TABLE: #... -0+60017c l O .data 0+1 bar +0+600180 l O .data 0+1 bar #... -0+60017d g O .data 0+1 foo +0+600181 g O .data 0+1 foo #... Disassembly of section .text: 0+400074 <_start>: -[ ]*[a-f0-9]+: 81 d0 7c 01 60 00 adc \$0x60017c,%eax -[ ]*[a-f0-9]+: 81 c3 7c 01 60 00 add \$0x60017c,%ebx -[ ]*[a-f0-9]+: 81 e1 7c 01 60 00 and \$0x60017c,%ecx -[ ]*[a-f0-9]+: 81 fa 7c 01 60 00 cmp \$0x60017c,%edx -[ ]*[a-f0-9]+: 81 ce 7c 01 60 00 or \$0x60017c,%esi -[ ]*[a-f0-9]+: 81 df 7c 01 60 00 sbb \$0x60017c,%edi -[ ]*[a-f0-9]+: 81 ed 7c 01 60 00 sub \$0x60017c,%ebp -[ ]*[a-f0-9]+: 41 81 f0 7c 01 60 00 xor \$0x60017c,%r8d -[ ]*[a-f0-9]+: 41 f7 c7 7c 01 60 00 test \$0x60017c,%r15d -[ ]*[a-f0-9]+: 48 81 d0 7c 01 60 00 adc \$0x60017c,%rax -[ ]*[a-f0-9]+: 48 81 c3 7c 01 60 00 add \$0x60017c,%rbx -[ ]*[a-f0-9]+: 48 81 e1 7c 01 60 00 and \$0x60017c,%rcx -[ ]*[a-f0-9]+: 48 81 fa 7c 01 60 00 cmp \$0x60017c,%rdx -[ ]*[a-f0-9]+: 48 81 cf 7c 01 60 00 or \$0x60017c,%rdi -[ ]*[a-f0-9]+: 48 81 de 7c 01 60 00 sbb \$0x60017c,%rsi -[ ]*[a-f0-9]+: 48 81 ed 7c 01 60 00 sub \$0x60017c,%rbp -[ ]*[a-f0-9]+: 49 81 f0 7c 01 60 00 xor \$0x60017c,%r8 -[ ]*[a-f0-9]+: 49 f7 c7 7c 01 60 00 test \$0x60017c,%r15 -[ ]*[a-f0-9]+: 81 d0 7d 01 60 00 adc \$0x60017d,%eax -[ ]*[a-f0-9]+: 81 c3 7d 01 60 00 add \$0x60017d,%ebx -[ ]*[a-f0-9]+: 81 e1 7d 01 60 00 and \$0x60017d,%ecx -[ ]*[a-f0-9]+: 81 fa 7d 01 60 00 cmp \$0x60017d,%edx -[ ]*[a-f0-9]+: 81 ce 7d 01 60 00 or \$0x60017d,%esi -[ ]*[a-f0-9]+: 81 df 7d 01 60 00 sbb \$0x60017d,%edi -[ ]*[a-f0-9]+: 81 ed 7d 01 60 00 sub \$0x60017d,%ebp -[ ]*[a-f0-9]+: 41 81 f0 7d 01 60 00 xor \$0x60017d,%r8d -[ ]*[a-f0-9]+: 41 f7 c7 7d 01 60 00 test \$0x60017d,%r15d -[ ]*[a-f0-9]+: 48 81 d0 7d 01 60 00 adc \$0x60017d,%rax -[ ]*[a-f0-9]+: 48 81 c3 7d 01 60 00 add \$0x60017d,%rbx -[ ]*[a-f0-9]+: 48 81 e1 7d 01 60 00 and \$0x60017d,%rcx -[ ]*[a-f0-9]+: 48 81 fa 7d 01 60 00 cmp \$0x60017d,%rdx -[ ]*[a-f0-9]+: 48 81 cf 7d 01 60 00 or \$0x60017d,%rdi -[ ]*[a-f0-9]+: 48 81 de 7d 01 60 00 sbb \$0x60017d,%rsi -[ ]*[a-f0-9]+: 48 81 ed 7d 01 60 00 sub \$0x60017d,%rbp -[ ]*[a-f0-9]+: 49 81 f0 7d 01 60 00 xor \$0x60017d,%r8 -[ ]*[a-f0-9]+: 49 f7 c7 7d 01 60 00 test \$0x60017d,%r15 + +[a-f0-9]+: 81 d0 80 01 60 00 adc \$0x600180,%eax + +[a-f0-9]+: 81 c3 80 01 60 00 add \$0x600180,%ebx + +[a-f0-9]+: 81 e1 80 01 60 00 and \$0x600180,%ecx + +[a-f0-9]+: 81 fa 80 01 60 00 cmp \$0x600180,%edx + +[a-f0-9]+: 81 ce 80 01 60 00 or \$0x600180,%esi + +[a-f0-9]+: 81 df 80 01 60 00 sbb \$0x600180,%edi + +[a-f0-9]+: 81 ed 80 01 60 00 sub \$0x600180,%ebp + +[a-f0-9]+: 41 81 f0 80 01 60 00 xor \$0x600180,%r8d + +[a-f0-9]+: 41 f7 c7 80 01 60 00 test \$0x600180,%r15d + +[a-f0-9]+: 48 81 d0 80 01 60 00 adc \$0x600180,%rax + +[a-f0-9]+: 48 81 c3 80 01 60 00 add \$0x600180,%rbx + +[a-f0-9]+: 48 81 e1 80 01 60 00 and \$0x600180,%rcx + +[a-f0-9]+: 48 81 fa 80 01 60 00 cmp \$0x600180,%rdx + +[a-f0-9]+: 48 81 cf 80 01 60 00 or \$0x600180,%rdi + +[a-f0-9]+: 48 81 de 80 01 60 00 sbb \$0x600180,%rsi + +[a-f0-9]+: 48 81 ed 80 01 60 00 sub \$0x600180,%rbp + +[a-f0-9]+: 49 81 f0 80 01 60 00 xor \$0x600180,%r8 + +[a-f0-9]+: 49 f7 c7 80 01 60 00 test \$0x600180,%r15 + +[a-f0-9]+: 81 d0 81 01 60 00 adc \$0x600181,%eax + +[a-f0-9]+: 81 c3 81 01 60 00 add \$0x600181,%ebx + +[a-f0-9]+: 81 e1 81 01 60 00 and \$0x600181,%ecx + +[a-f0-9]+: 81 fa 81 01 60 00 cmp \$0x600181,%edx + +[a-f0-9]+: 81 ce 81 01 60 00 or \$0x600181,%esi + +[a-f0-9]+: 81 df 81 01 60 00 sbb \$0x600181,%edi + +[a-f0-9]+: 81 ed 81 01 60 00 sub \$0x600181,%ebp + +[a-f0-9]+: 41 81 f0 81 01 60 00 xor \$0x600181,%r8d + +[a-f0-9]+: 41 f7 c7 81 01 60 00 test \$0x600181,%r15d + +[a-f0-9]+: 48 81 d0 81 01 60 00 adc \$0x600181,%rax + +[a-f0-9]+: 48 81 c3 81 01 60 00 add \$0x600181,%rbx + +[a-f0-9]+: 48 81 e1 81 01 60 00 and \$0x600181,%rcx + +[a-f0-9]+: 48 81 fa 81 01 60 00 cmp \$0x600181,%rdx + +[a-f0-9]+: 48 81 cf 81 01 60 00 or \$0x600181,%rdi + +[a-f0-9]+: 48 81 de 81 01 60 00 sbb \$0x600181,%rsi + +[a-f0-9]+: 48 81 ed 81 01 60 00 sub \$0x600181,%rbp + +[a-f0-9]+: 49 81 f0 81 01 60 00 xor \$0x600181,%r8 + +[a-f0-9]+: 49 f7 c7 81 01 60 00 test \$0x600181,%r15 +#pass #pass diff --git a/ld/testsuite/ld-x86-64/mpx.exp b/ld/testsuite/ld-x86-64/mpx.exp index 3de224e..1ba08e0 100644 --- a/ld/testsuite/ld-x86-64/mpx.exp +++ b/ld/testsuite/ld-x86-64/mpx.exp @@ -118,6 +118,12 @@ run_ld_link_tests { {"Build mpx4" "-m elf_x86_64 -z bndplt tmpdir/libcall1.so" "" "--64" {mpx4a.s} {{objdump -dw mpx4.dd}} "mpx4"} + {"Build mpx3 (-z now)" + "-z now -m elf_x86_64 -z bndplt tmpdir/libcall.so" "" "--64" + {mpx3a.s} {{objdump -dw mpx3n.dd}} "mpx3n"} + {"Build mpx4 (-z now)" + "-z now -m elf_x86_64 -z bndplt tmpdir/libcall1.so" "" "--64" + {mpx4a.s} {{objdump -dw mpx4n.dd}} "mpx4n"} } run_ld_link_exec_tests $run_tests @@ -126,3 +132,7 @@ run_dump_test "bnd-branch-1" run_dump_test "bnd-ifunc-1" run_dump_test "bnd-ifunc-2" run_dump_test "bnd-plt-1" +run_dump_test "bnd-branch-1-now" +run_dump_test "bnd-ifunc-1-now" +run_dump_test "bnd-ifunc-2-now" +run_dump_test "bnd-plt-1-now" diff --git a/ld/testsuite/ld-x86-64/mpx3n.dd b/ld/testsuite/ld-x86-64/mpx3n.dd new file mode 100644 index 0000000..d8e238e --- /dev/null +++ b/ld/testsuite/ld-x86-64/mpx3n.dd @@ -0,0 +1,28 @@ +.*: +file format .* + + +Disassembly of section .plt: + +0+400290 <.plt>: + +[a-f0-9]+: ff 35 a2 01 20 00 pushq 0x2001a2\(%rip\) # 600438 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: f2 ff 25 a3 01 20 00 bnd jmpq \*0x2001a3\(%rip\) # 600440 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 00 nopl \(%rax\) + +[a-f0-9]+: 68 00 00 00 00 pushq \$0x0 + +[a-f0-9]+: f2 e9 e5 ff ff ff bnd jmpq 400290 <.plt> + +[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) + +Disassembly of section .plt.bnd: + +0+4002b0 <call1@plt>: + +[a-f0-9]+: f2 ff 25 91 01 20 00 bnd jmpq \*0x200191\(%rip\) # 600448 <call1> + +[a-f0-9]+: 90 nop + +Disassembly of section .text: + +0+4002b8 <_start>: + +[a-f0-9]+: bf b0 02 40 00 mov \$0x4002b0,%edi + +[a-f0-9]+: f2 ff d7 bnd callq \*%rdi + +[a-f0-9]+: 48 8b 3d 89 01 20 00 mov 0x200189\(%rip\),%rdi # 600450 <call2> + +[a-f0-9]+: f2 ff d7 bnd callq \*%rdi + +[a-f0-9]+: c3 retq +#pass diff --git a/ld/testsuite/ld-x86-64/mpx4n.dd b/ld/testsuite/ld-x86-64/mpx4n.dd new file mode 100644 index 0000000..e8777cc --- /dev/null +++ b/ld/testsuite/ld-x86-64/mpx4n.dd @@ -0,0 +1,25 @@ +.*: +file format .* + + +Disassembly of section .plt: + +0+400260 <.plt>: + +[a-f0-9]+: ff 35 62 01 20 00 pushq 0x200162\(%rip\) # 6003c8 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: f2 ff 25 63 01 20 00 bnd jmpq \*0x200163\(%rip\) # 6003d0 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 00 nopl \(%rax\) + +[a-f0-9]+: 68 00 00 00 00 pushq \$0x0 + +[a-f0-9]+: f2 e9 e5 ff ff ff bnd jmpq 400260 <.plt> + +[a-f0-9]+: 0f 1f 44 00 00 nopl 0x0\(%rax,%rax,1\) + +Disassembly of section .plt.bnd: + +0+400280 <call1@plt>: + +[a-f0-9]+: f2 ff 25 51 01 20 00 bnd jmpq \*0x200151\(%rip\) # 6003d8 <call1> + +[a-f0-9]+: 90 nop + +Disassembly of section .text: + +0+400288 <_start>: + +[a-f0-9]+: bf 80 02 40 00 mov \$0x400280,%edi + +[a-f0-9]+: f2 ff d7 bnd callq \*%rdi +#pass diff --git a/ld/testsuite/ld-x86-64/plt-main-bnd-now.rd b/ld/testsuite/ld-x86-64/plt-main-bnd-now.rd new file mode 100644 index 0000000..460b7e2 --- /dev/null +++ b/ld/testsuite/ld-x86-64/plt-main-bnd-now.rd @@ -0,0 +1,3 @@ +#... + +\[[ 0-9]+\] \.plt\.bnd +.* +#pass diff --git a/ld/testsuite/ld-x86-64/plt-main-bnd.dd b/ld/testsuite/ld-x86-64/plt-main-bnd.dd index 91fc945..9e03dfd 100644 --- a/ld/testsuite/ld-x86-64/plt-main-bnd.dd +++ b/ld/testsuite/ld-x86-64/plt-main-bnd.dd @@ -1,7 +1,7 @@ #... Disassembly of section .plt.got: -[a-f0-9]+ <.plt.got>: +[a-f0-9]+ <[a-z]+@plt>: [ ]*[a-f0-9]+: f2 ff 25 .. .. 20 00 bnd jmpq \*0x20....\(%rip\) # ...... <.*> [ ]*[a-f0-9]+: 90 nop #pass diff --git a/ld/testsuite/ld-x86-64/plt2.dd b/ld/testsuite/ld-x86-64/plt2.dd new file mode 100644 index 0000000..a89e5ba --- /dev/null +++ b/ld/testsuite/ld-x86-64/plt2.dd @@ -0,0 +1,34 @@ +#source: plt2.s +#as: --64 +#ld: -z now -melf_x86_64 +#objdump: -dwr +#target: i?86-*-* + +.*: +file format .* + + +Disassembly of section .plt: + +0+400290 <.plt>: + +[a-f0-9]+: ff 35 aa 01 20 00 pushq 0x2001aa\(%rip\) # 600440 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: ff 25 ac 01 20 00 jmpq \*0x2001ac\(%rip\) # 600448 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 40 00 nopl 0x0\(%rax\) + +0+4002a0 <fn1@plt>: + +[a-f0-9]+: ff 25 aa 01 20 00 jmpq \*0x2001aa\(%rip\) # 600450 <fn1> + +[a-f0-9]+: 68 00 00 00 00 pushq \$0x0 + +[a-f0-9]+: e9 e0 ff ff ff jmpq 400290 <.plt> + +Disassembly of section .plt.got: + +0+4002b0 <fn2@plt>: + +[a-f0-9]+: ff 25 7a 01 20 00 jmpq \*0x20017a\(%rip\) # 600430 <fn2> + +[a-f0-9]+: 66 90 xchg %ax,%ax + +Disassembly of section .text: + +0+4002b8 <_start>: + +[a-f0-9]+: e8 e3 ff ff ff callq 4002a0 <fn1@plt> + +[a-f0-9]+: e8 ee ff ff ff callq 4002b0 <fn2@plt> + +[a-f0-9]+: 81 7c 24 08 a0 02 40 00 cmpl \$0x4002a0,0x8\(%rsp\) +#pass diff --git a/ld/testsuite/ld-x86-64/plt2.rd b/ld/testsuite/ld-x86-64/plt2.rd new file mode 100644 index 0000000..fa93f2a --- /dev/null +++ b/ld/testsuite/ld-x86-64/plt2.rd @@ -0,0 +1,9 @@ +#source: plt2.s +#as: --64 +#ld: -z now -melf_x86_64 +#readelf: -SW +#target: i?86-*-* + +#... + +\[ *[0-9]+\] \.plt +PROGBITS +[0-9a-f]+ +[0-9a-f]+ +0+20 +.* +AX +0 +0 +16 +#pass diff --git a/ld/testsuite/ld-x86-64/plt2.s b/ld/testsuite/ld-x86-64/plt2.s new file mode 100644 index 0000000..25859fa --- /dev/null +++ b/ld/testsuite/ld-x86-64/plt2.s @@ -0,0 +1,7 @@ + .text + .globl _start + .type _start,@function +_start: + call fn1 + call fn2 + cmpl $fn1, 8(%rsp) diff --git a/ld/testsuite/ld-x86-64/pr20253-1h.d b/ld/testsuite/ld-x86-64/pr20253-1h.d index 14a8f1b..e69893f 100644 --- a/ld/testsuite/ld-x86-64/pr20253-1h.d +++ b/ld/testsuite/ld-x86-64/pr20253-1h.d @@ -16,10 +16,10 @@ Disassembly of section .text: +[a-f0-9]+: c3 retq 0+40008e <_start>: - +[a-f0-9]+: ff 15 28 00 20 00 callq \*0x200028\(%rip\) # 6000bc <.*> - +[a-f0-9]+: ff 25 2a 00 20 00 jmpq \*0x20002a\(%rip\) # 6000c4 <.*> - +[a-f0-9]+: 48 c7 05 1f 00 20 00 00 00 00 00 movq \$0x0,0x20001f\(%rip\) # 6000c4 <.*> - +[a-f0-9]+: 48 83 3d 0f 00 20 00 00 cmpq \$0x0,0x20000f\(%rip\) # 6000bc <.*> - +[a-f0-9]+: 48 3b 0d 08 00 20 00 cmp 0x200008\(%rip\),%rcx # 6000bc <.*> - +[a-f0-9]+: 48 3b 0d 09 00 20 00 cmp 0x200009\(%rip\),%rcx # 6000c4 <.*> + +[a-f0-9]+: ff 15 2c 00 20 00 callq \*0x20002c\(%rip\) # 6000c0 <.got> + +[a-f0-9]+: ff 25 2e 00 20 00 jmpq \*0x20002e\(%rip\) # 6000c8 <.got\+0x8> + +[a-f0-9]+: 48 c7 05 23 00 20 00 00 00 00 00 movq \$0x0,0x200023\(%rip\) # 6000c8 <.got\+0x8> + +[a-f0-9]+: 48 83 3d 13 00 20 00 00 cmpq \$0x0,0x200013\(%rip\) # 6000c0 <.got> + +[a-f0-9]+: 48 3b 0d 0c 00 20 00 cmp 0x20000c\(%rip\),%rcx # 6000c0 <.got> + +[a-f0-9]+: 48 3b 0d 0d 00 20 00 cmp 0x20000d\(%rip\),%rcx # 6000c8 <.got\+0x8> #pass diff --git a/ld/testsuite/ld-x86-64/pr20830a-now.d b/ld/testsuite/ld-x86-64/pr20830a-now.d new file mode 100644 index 0000000..fda0d50 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr20830a-now.d @@ -0,0 +1,68 @@ +#name: PR ld/20830 (.plt.got, -z now) +#source: pr20830.s +#as: --64 +#ld: -z now -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 0000000000000010 0000005c FDE cie=00000000 pc=0000000000000230..0000000000000238 + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + + +Disassembly of section .plt: + +0+220 <.plt>: + +[a-f0-9]+: ff 35 c2 0d 20 00 pushq 0x200dc2\(%rip\) # 200fe8 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: ff 25 c4 0d 20 00 jmpq \*0x200dc4\(%rip\) # 200ff0 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 40 00 nopl 0x0\(%rax\) + +Disassembly of section .plt.got: + +0+230 <func@plt>: + +[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 <func@plt> + +[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/pr20830a.d b/ld/testsuite/ld-x86-64/pr20830a.d index caa4fe8..3122ba7 100644 --- a/ld/testsuite/ld-x86-64/pr20830a.d +++ b/ld/testsuite/ld-x86-64/pr20830a.d @@ -56,13 +56,13 @@ Disassembly of section .plt: Disassembly of section .plt.got: -0+230 <.plt.got>: +0+230 <func@plt>: +[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]+: e8 f3 ff ff ff callq 230 <func@plt> +[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/pr20830b-now.d b/ld/testsuite/ld-x86-64/pr20830b-now.d new file mode 100644 index 0000000..69120e1 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr20830b-now.d @@ -0,0 +1,60 @@ +#name: PR ld/20830 (.plt.got, -z now) +#source: pr20830.s +#as: --x32 +#ld: -z now -melf32_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 0000000000000010 0000001c FDE cie=00000000 pc=0000000000000188..0000000000000194 + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + +0+2c 0000000000000020 00000030 FDE cie=00000000 pc=0000000000000170..0000000000000180 + DW_CFA_def_cfa_offset: 16 + DW_CFA_advance_loc: 6 to 0000000000000176 + DW_CFA_def_cfa_offset: 24 + DW_CFA_advance_loc: 10 to 0000000000000180 + 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\) + +0+50 0000000000000010 00000054 FDE cie=00000000 pc=0000000000000180..0000000000000188 + DW_CFA_nop + DW_CFA_nop + DW_CFA_nop + + +Disassembly of section .plt: + +0+170 <.plt>: + +[a-f0-9]+: ff 35 72 0e 20 00 pushq 0x200e72\(%rip\) # 200fe8 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: ff 25 74 0e 20 00 jmpq \*0x200e74\(%rip\) # 200ff0 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 40 00 nopl 0x0\(%rax\) + +Disassembly of section .plt.got: + +0+180 <func@plt>: + +[a-f0-9]+: ff 25 72 0e 20 00 jmpq \*0x200e72\(%rip\) # 200ff8 <func> + +[a-f0-9]+: 66 90 xchg %ax,%ax + +Disassembly of section .text: + +0+188 <foo>: + +[a-f0-9]+: e8 f3 ff ff ff callq 180 <func@plt> + +[a-f0-9]+: 48 8b 05 64 0e 20 00 mov 0x200e64\(%rip\),%rax # 200ff8 <func> +#pass diff --git a/ld/testsuite/ld-x86-64/pr20830b.d b/ld/testsuite/ld-x86-64/pr20830b.d index 218a56e..0bb79a3 100644 --- a/ld/testsuite/ld-x86-64/pr20830b.d +++ b/ld/testsuite/ld-x86-64/pr20830b.d @@ -48,13 +48,13 @@ Disassembly of section .plt: Disassembly of section .plt.got: -0+180 <.plt.got>: +0+180 <func@plt>: +[a-f0-9]+: ff 25 72 0e 20 00 jmpq \*0x200e72\(%rip\) # 200ff8 <func> +[a-f0-9]+: 66 90 xchg %ax,%ax Disassembly of section .text: 0+188 <foo>: - +[a-f0-9]+: e8 f3 ff ff ff callq 180 <.plt.got> + +[a-f0-9]+: e8 f3 ff ff ff callq 180 <func@plt> +[a-f0-9]+: 48 8b 05 64 0e 20 00 mov 0x200e64\(%rip\),%rax # 200ff8 <func> #pass diff --git a/ld/testsuite/ld-x86-64/pr21038a-now.d b/ld/testsuite/ld-x86-64/pr21038a-now.d new file mode 100644 index 0000000..ebc5128 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr21038a-now.d @@ -0,0 +1,72 @@ +#name: PR ld/21038 (.plt.got, -z now) +#source: pr21038a.s +#as: --64 +#ld: -z now -z bndplt -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_lit5; 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 c2 0d 20 00 pushq 0x200dc2\(%rip\) # 200fe8 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: f2 ff 25 c3 0d 20 00 bnd jmpq \*0x200dc3\(%rip\) # 200ff0 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 00 nopl \(%rax\) + +Disassembly of section .plt.got: + +0+230 <func@plt>: + +[a-f0-9]+: f2 ff 25 c1 0d 20 00 bnd jmpq \*0x200dc1\(%rip\) # 200ff8 <func> + +[a-f0-9]+: 90 nop + +Disassembly of section .text: + +0+238 <foo>: + +[a-f0-9]+: e8 f3 ff ff ff callq 230 <func@plt> + +[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/pr21038a.d b/ld/testsuite/ld-x86-64/pr21038a.d index f2f88eb..81b26cb 100644 --- a/ld/testsuite/ld-x86-64/pr21038a.d +++ b/ld/testsuite/ld-x86-64/pr21038a.d @@ -59,13 +59,13 @@ Disassembly of section .plt: Disassembly of section .plt.got: -0+230 <.plt.got>: +0+230 <func@plt>: +[a-f0-9]+: f2 ff 25 c1 0d 20 00 bnd jmpq \*0x200dc1\(%rip\) # 200ff8 <func> +[a-f0-9]+: 90 nop Disassembly of section .text: 0+238 <foo>: - +[a-f0-9]+: e8 f3 ff ff ff callq 230 <.plt.got> + +[a-f0-9]+: e8 f3 ff ff ff callq 230 <func@plt> +[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/pr21038b-now.d b/ld/testsuite/ld-x86-64/pr21038b-now.d new file mode 100644 index 0000000..562c7f1 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr21038b-now.d @@ -0,0 +1,71 @@ +#name: PR ld/21038 (.plt.bnd, -z now) +#source: pr21038b.s +#as: --64 +#ld: -z now -z bndplt -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..000000000000023d + 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_lit5; 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 c2 0d 20 00 pushq 0x200dc2\(%rip\) # 200fe8 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: f2 ff 25 c3 0d 20 00 bnd jmpq \*0x200dc3\(%rip\) # 200ff0 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 00 nopl \(%rax\) + +Disassembly of section .plt.got: + +0+230 <func@plt>: + +[a-f0-9]+: f2 ff 25 c1 0d 20 00 bnd jmpq \*0x200dc1\(%rip\) # 200ff8 <func> + +[a-f0-9]+: 90 nop + +Disassembly of section .text: + +0+238 <foo>: + +[a-f0-9]+: e8 f3 ff ff ff callq 230 <func@plt> +#pass diff --git a/ld/testsuite/ld-x86-64/pr21038c-now.d b/ld/testsuite/ld-x86-64/pr21038c-now.d new file mode 100644 index 0000000..ca24335 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr21038c-now.d @@ -0,0 +1,77 @@ +#name: PR ld/21038 (.plt.got and .plt.bnd, -z now) +#source: pr21038c.s +#as: --64 +#ld: -z now -z bndplt -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=0000000000000280..0000000000000291 + 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=0000000000000260..0000000000000270 + DW_CFA_def_cfa_offset: 16 + DW_CFA_advance_loc: 6 to 0000000000000266 + DW_CFA_def_cfa_offset: 24 + DW_CFA_advance_loc: 10 to 0000000000000270 + DW_CFA_def_cfa_expression \(DW_OP_breg7 \(rsp\): 8; DW_OP_breg16 \(rip\): 0; DW_OP_lit15; DW_OP_and; DW_OP_lit5; 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=0000000000000270..0000000000000280 + 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+260 <.plt>: + +[a-f0-9]+: ff 35 7a 0d 20 00 pushq 0x200d7a\(%rip\) # 200fe0 <_GLOBAL_OFFSET_TABLE_\+0x8> + +[a-f0-9]+: f2 ff 25 7b 0d 20 00 bnd jmpq \*0x200d7b\(%rip\) # 200fe8 <_GLOBAL_OFFSET_TABLE_\+0x10> + +[a-f0-9]+: 0f 1f 00 nopl \(%rax\) + +Disassembly of section .plt.got: + +0+270 <func1@plt>: + +[a-f0-9]+: f2 ff 25 79 0d 20 00 bnd jmpq \*0x200d79\(%rip\) # 200ff0 <func1> + +[a-f0-9]+: 90 nop + +0+278 <func2@plt>: + +[a-f0-9]+: f2 ff 25 79 0d 20 00 bnd jmpq \*0x200d79\(%rip\) # 200ff8 <func2> + +[a-f0-9]+: 90 nop + +Disassembly of section .text: + +0+280 <foo>: + +[a-f0-9]+: e8 eb ff ff ff callq 270 <func1@plt> + +[a-f0-9]+: e8 ee ff ff ff callq 278 <func2@plt> + +[a-f0-9]+: 48 8b 05 5f 0d 20 00 mov 0x200d5f\(%rip\),%rax # 200ff0 <func1> +#pass diff --git a/ld/testsuite/ld-x86-64/pr21038c.d b/ld/testsuite/ld-x86-64/pr21038c.d index 05b3622..719a6e1 100644 --- a/ld/testsuite/ld-x86-64/pr21038c.d +++ b/ld/testsuite/ld-x86-64/pr21038c.d @@ -67,7 +67,7 @@ Disassembly of section .plt: Disassembly of section .plt.got: -0+280 <.plt.got>: +0+280 <func1@plt>: +[a-f0-9]+: f2 ff 25 71 0d 20 00 bnd jmpq \*0x200d71\(%rip\) # 200ff8 <func1> +[a-f0-9]+: 90 nop @@ -80,7 +80,7 @@ Disassembly of section .plt.bnd: Disassembly of section .text: 0+290 <foo>: - +[a-f0-9]+: e8 eb ff ff ff callq 280 <.plt.got> + +[a-f0-9]+: e8 eb ff ff ff callq 280 <func1@plt> +[a-f0-9]+: e8 ee ff ff ff callq 288 <func2@plt> +[a-f0-9]+: 48 8b 05 57 0d 20 00 mov 0x200d57\(%rip\),%rax # 200ff8 <func1> #pass diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 7127eca..84cc7d7 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -1245,6 +1245,24 @@ if { [isnative] && [which $CC] != 0 } { {{objdump {-drw} plt-main-bnd.dd}} \ "plt-main-pie-bnd" \ ] \ + [list \ + "Build plt-main with -z bndplt -z now" \ + "tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \ + tmpdir/plt-main4.o tmpdir/libplt-lib.so -z bndplt -z now" \ + "" \ + { plt-main5.c } \ + {{readelf {-SW} plt-main-bnd-now.rd} {objdump {-drw} plt-main-bnd.dd}} \ + "plt-main-bnd-now" \ + ] \ + [list \ + "Build plt-main with PIE and -z bndplt -z now" \ + "tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \ + tmpdir/plt-main4.o tmpdir/libplt-lib.so -z bndplt -z now -pie" \ + "-fPIC" \ + { plt-main5.c } \ + {{readelf {-SW} plt-main-bnd-now.rd} {objdump {-drw} plt-main-bnd.dd}} \ + "plt-main-pie-bnd-now" \ + ] \ ] run_ld_link_exec_tests [list \ @@ -1270,6 +1288,27 @@ if { [isnative] && [which $CC] != 0 } { "-fPIC" \ ] \ [list \ + "Run plt-main with -z bndplt -z now" \ + "-Wl,--no-as-needed,-z,bndplt,-z,now tmpdir/plt-main1.o \ + tmpdir/plt-main2.o tmpdir/plt-main3.o \ + tmpdir/plt-main4.o tmpdir/libplt-lib.so" \ + "" \ + { plt-main5.c } \ + "plt-main-bnd-now" \ + "plt-main.out" \ + ] \ + [list \ + "Run plt-main with PIE and -z bndplt -z now" \ + "-Wl,--no-as-needed,-z,bndplt,-z,now -pie tmpdir/plt-main1.o \ + tmpdir/plt-main2.o tmpdir/plt-main3.o \ + tmpdir/plt-main4.o tmpdir/libplt-lib.so" \ + "" \ + { plt-main5.c } \ + "plt-main-pie-bnd-now" \ + "plt-main.out" \ + "-fPIC" \ + ] \ + [list \ "Run pr20800" \ "-Wl,-z,now -pie" \ "" \ @@ -1291,6 +1330,18 @@ if { ![istarget "x86_64-*-linux*"]} { return } +run_ld_link_tests [list \ + [list \ + "basic PLT generation (-z now)" \ + "-z now -melf_x86_64 tmpdir/libpltlib.so" \ + "" \ + "--64" \ + {plt2.s} \ + {{readelf -SW plt2.rd} {objdump -dwr plt2.dd}} \ + "plt2" \ + ] \ +] + # Linux only tests run_dump_test "pr17618" run_dump_test "pltgot-1" @@ -1300,3 +1351,8 @@ run_dump_test "pr20830b" run_dump_test "pr21038a" run_dump_test "pr21038b" run_dump_test "pr21038c" +run_dump_test "pr20830a-now" +run_dump_test "pr20830b-now" +run_dump_test "pr21038a-now" +run_dump_test "pr21038b-now" +run_dump_test "pr21038c-now" |