aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-05-08 12:24:11 -0700
committerH.J. Lu <hjl.tools@gmail.com>2017-05-08 12:24:29 -0700
commit38b123494b38ae09168387c0502acd1f23c1b601 (patch)
tree723d1c636b173f5d94346879cefaa4c2b2bb5f68 /ld
parentd7ab4911f8aa3e1cd06ece40f74d0b4a532d6a10 (diff)
downloadgdb-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')
-rw-r--r--ld/ChangeLog33
-rw-r--r--ld/testsuite/ld-ifunc/ifunc-16-x86-64-now.d14
-rw-r--r--ld/testsuite/ld-ifunc/ifunc-2-local-x86-64-now.d32
-rw-r--r--ld/testsuite/ld-ifunc/ifunc-2-x86-64-now.d32
-rw-r--r--ld/testsuite/ld-ifunc/pr17154-x86-64-now.d51
-rw-r--r--ld/testsuite/ld-x86-64/bnd-branch-1-now.d43
-rw-r--r--ld/testsuite/ld-x86-64/bnd-ifunc-1-now.d33
-rw-r--r--ld/testsuite/ld-x86-64/bnd-ifunc-2-now.d55
-rw-r--r--ld/testsuite/ld-x86-64/bnd-plt-1-now.d43
-rw-r--r--ld/testsuite/ld-x86-64/load1b-nacl.d76
-rw-r--r--ld/testsuite/ld-x86-64/load1b.d77
-rw-r--r--ld/testsuite/ld-x86-64/mpx.exp10
-rw-r--r--ld/testsuite/ld-x86-64/mpx3n.dd28
-rw-r--r--ld/testsuite/ld-x86-64/mpx4n.dd25
-rw-r--r--ld/testsuite/ld-x86-64/plt-main-bnd-now.rd3
-rw-r--r--ld/testsuite/ld-x86-64/plt-main-bnd.dd2
-rw-r--r--ld/testsuite/ld-x86-64/plt2.dd34
-rw-r--r--ld/testsuite/ld-x86-64/plt2.rd9
-rw-r--r--ld/testsuite/ld-x86-64/plt2.s7
-rw-r--r--ld/testsuite/ld-x86-64/pr20253-1h.d12
-rw-r--r--ld/testsuite/ld-x86-64/pr20830a-now.d68
-rw-r--r--ld/testsuite/ld-x86-64/pr20830a.d4
-rw-r--r--ld/testsuite/ld-x86-64/pr20830b-now.d60
-rw-r--r--ld/testsuite/ld-x86-64/pr20830b.d4
-rw-r--r--ld/testsuite/ld-x86-64/pr21038a-now.d72
-rw-r--r--ld/testsuite/ld-x86-64/pr21038a.d4
-rw-r--r--ld/testsuite/ld-x86-64/pr21038b-now.d71
-rw-r--r--ld/testsuite/ld-x86-64/pr21038c-now.d77
-rw-r--r--ld/testsuite/ld-x86-64/pr21038c.d4
-rw-r--r--ld/testsuite/ld-x86-64/x86-64.exp56
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"