• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

GNU Binutils with patches for OS216


Commit MetaInfo

修訂bf54968b128a2133174d81c438d402ecfaf83042 (tree)
時間2018-03-25 21:02:32
作者H.J. Lu <hjl.tools@gmai...>
CommiterH.J. Lu

Log Message

x86-64: Add ENDBR64 to the TLSDESC PLT entry

The TLSDESC entry in a lazy procedure linkage table is called indirectly
with "callq *(%rax)". This patch adds an ENDBR64 to support indirect
branch tracking in Intel CET. The TLSDESC PLT entry now looks like:

0xf3, 0x0f, 0x1e, 0xfa, /* endbr64 */
0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
0xff, 0x25, 16, 0, 0, 0 /* jmpq *GOT+TDG(%rip) */

The BND prefix isn't needed since MPX isn't used for TLSDESC.

bfd/

PR ld/23000
* elf64-x86-64.c (elf_x86_64_finish_dynamic_sections): Add
ENDBR64 to the TLSDESC PLT entry.

ld/

PR ld/23000
* testsuite/ld-x86-64/tlsdesc.pd: Updated.

Change Summary

差異

--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
1+2018-03-25 H.J. Lu <hongjiu.lu@intel.com>
2+
3+ PR ld/23000
4+ * elf64-x86-64.c (elf_x86_64_finish_dynamic_sections): Add
5+ ENDBR64 to the TLSDESC PLT entry.
6+
17 2018-03-21 Alan Modra <amodra@gmail.com>
28
39 * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Trim uninteresting
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -4411,15 +4411,23 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
44114411
44124412 if (htab->tlsdesc_plt)
44134413 {
4414+ /* The TLSDESC entry in a lazy procedure linkage table. */
4415+ static const bfd_byte tlsdesc_plt_entry[LAZY_PLT_ENTRY_SIZE] =
4416+ {
4417+ 0xf3, 0x0f, 0x1e, 0xfa, /* endbr64 */
4418+ 0xff, 0x35, 8, 0, 0, 0, /* pushq GOT+8(%rip) */
4419+ 0xff, 0x25, 16, 0, 0, 0 /* jmpq *GOT+TDG(%rip) */
4420+ };
4421+
44144422 bfd_put_64 (output_bfd, (bfd_vma) 0,
44154423 htab->elf.sgot->contents + htab->tlsdesc_got);
44164424
44174425 memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
4418- htab->lazy_plt->plt0_entry,
4419- htab->lazy_plt->plt0_entry_size);
4426+ tlsdesc_plt_entry, LAZY_PLT_ENTRY_SIZE);
44204427
4421- /* Add offset for pushq GOT+8(%rip), since the
4422- instruction uses 6 bytes subtract this value. */
4428+ /* Add offset for pushq GOT+8(%rip), since ENDBR64 uses 4
4429+ bytes and the instruction uses 6 bytes, subtract these
4430+ values. */
44234431 bfd_put_32 (output_bfd,
44244432 (htab->elf.sgotplt->output_section->vma
44254433 + htab->elf.sgotplt->output_offset
@@ -4427,14 +4435,13 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
44274435 - htab->elf.splt->output_section->vma
44284436 - htab->elf.splt->output_offset
44294437 - htab->tlsdesc_plt
4430- - 6),
4438+ - 4 - 6),
44314439 (htab->elf.splt->contents
44324440 + htab->tlsdesc_plt
4433- + htab->lazy_plt->plt0_got1_offset));
4434- /* Add offset for the PC-relative instruction accessing
4435- GOT+TDG, where TDG stands for htab->tlsdesc_got,
4436- subtracting the offset to the end of that
4437- instruction. */
4441+ + 4 + 2));
4442+ /* Add offset for indirect branch via GOT+TDG, where TDG
4443+ stands for htab->tlsdesc_got, subtracting the offset
4444+ to the end of that instruction. */
44384445 bfd_put_32 (output_bfd,
44394446 (htab->elf.sgot->output_section->vma
44404447 + htab->elf.sgot->output_offset
@@ -4442,10 +4449,9 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
44424449 - htab->elf.splt->output_section->vma
44434450 - htab->elf.splt->output_offset
44444451 - htab->tlsdesc_plt
4445- - htab->lazy_plt->plt0_got2_insn_end),
4452+ - 4 - 6 - 6),
44464453 (htab->elf.splt->contents
4447- + htab->tlsdesc_plt
4448- + htab->lazy_plt->plt0_got2_offset));
4454+ + htab->tlsdesc_plt + 4 + 6 + 2));
44494455 }
44504456 }
44514457
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
1+2018-03-25 H.J. Lu <hongjiu.lu@intel.com>
2+
3+ PR ld/23000
4+ * testsuite/ld-x86-64/tlsdesc.pd: Updated.
5+
16 2018-03-23 Nick Clifton <nickc@redhat.com>
27
38 PR 22948
--- a/ld/testsuite/ld-x86-64/tlsdesc.pd
+++ b/ld/testsuite/ld-x86-64/tlsdesc.pd
@@ -13,7 +13,7 @@ Disassembly of section .plt:
1313 [0-9a-f]+: ff 35 .. .. 20 00 pushq .*\(%rip\) # 201358 <_GLOBAL_OFFSET_TABLE_\+0x8>
1414 [0-9a-f]+: ff 25 .. .. 20 00 jmpq \*.*\(%rip\) # 201360 <_GLOBAL_OFFSET_TABLE_\+0x10>
1515 [0-9a-f]+: 0f 1f 40 00 nopl 0x0\(%rax\)
16+ [0-9a-f]+: f3 0f 1e fa endbr64
1617 [0-9a-f]+: ff 35 .. .. 20 00 pushq .*\(%rip\) # 201358 <_GLOBAL_OFFSET_TABLE_\+0x8>
1718 [0-9a-f]+: ff 25 .. .. 20 00 jmpq \*.*\(%rip\) # 201348 <.*>
18- [0-9a-f]+: 0f 1f 40 00 nopl 0x0\(%rax\)
1919