This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb/binutils-2_30-branch] x86-64: Add ENDBR64 to the TLSDESC PLT entry


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=963e88c631ad5878d70d055fd8597c83279efe66

commit 963e88c631ad5878d70d055fd8597c83279efe66
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Mon Mar 26 03:57:01 2018 -0700

    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.
    
    (cherry picked from commit bf54968b128a2133174d81c438d402ecfaf83042)

Diff:
---
 bfd/ChangeLog                     |  9 +++++++++
 bfd/elf64-x86-64.c                | 32 +++++++++++++++++++-------------
 ld/ChangeLog                      |  8 ++++++++
 ld/testsuite/ld-x86-64/tlsdesc.pd |  2 +-
 4 files changed, 37 insertions(+), 14 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 3c9e08b..b6b05ec 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2018-03-26  H.J. Lu  <hongjiu.lu@intel.com>
+
+	Backport from master branch
+	2018-03-25  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/23000
+	* elf64-x86-64.c (elf_x86_64_finish_dynamic_sections): Add
+	ENDBR64 to the TLSDESC PLT entry.
+
 2018-03-21  Alan Modra  <amodra@gmail.com>
 
 	Apply from master
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index ba4f47b..30e07c4 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -4393,15 +4393,23 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
 
       if (htab->tlsdesc_plt)
 	{
+	  /* The TLSDESC entry in a lazy procedure linkage table.  */
+	  static const bfd_byte tlsdesc_plt_entry[LAZY_PLT_ENTRY_SIZE] =
+	    {
+	      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)	*/
+	    };
+
 	  bfd_put_64 (output_bfd, (bfd_vma) 0,
 		      htab->elf.sgot->contents + htab->tlsdesc_got);
 
 	  memcpy (htab->elf.splt->contents + htab->tlsdesc_plt,
-		  htab->lazy_plt->plt0_entry,
-		  htab->lazy_plt->plt0_entry_size);
+		  tlsdesc_plt_entry, LAZY_PLT_ENTRY_SIZE);
 
-	  /* Add offset for pushq GOT+8(%rip), since the
-	     instruction uses 6 bytes subtract this value.  */
+	  /* Add offset for pushq GOT+8(%rip), since ENDBR64 uses 4
+	     bytes and the instruction uses 6 bytes, subtract these
+	     values.  */
 	  bfd_put_32 (output_bfd,
 		      (htab->elf.sgotplt->output_section->vma
 		       + htab->elf.sgotplt->output_offset
@@ -4409,14 +4417,13 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
 		       - htab->elf.splt->output_section->vma
 		       - htab->elf.splt->output_offset
 		       - htab->tlsdesc_plt
-		       - 6),
+		       - 4 - 6),
 		      (htab->elf.splt->contents
 		       + htab->tlsdesc_plt
-		       + htab->lazy_plt->plt0_got1_offset));
-	  /* Add offset for the PC-relative instruction accessing
-	     GOT+TDG, where TDG stands for htab->tlsdesc_got,
-	     subtracting the offset to the end of that
-	     instruction.  */
+		       + 4 + 2));
+	  /* Add offset for indirect branch via GOT+TDG, where TDG
+	     stands for htab->tlsdesc_got, subtracting the offset
+	     to the end of that instruction.  */
 	  bfd_put_32 (output_bfd,
 		      (htab->elf.sgot->output_section->vma
 		       + htab->elf.sgot->output_offset
@@ -4424,10 +4431,9 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
 		       - htab->elf.splt->output_section->vma
 		       - htab->elf.splt->output_offset
 		       - htab->tlsdesc_plt
-		       - htab->lazy_plt->plt0_got2_insn_end),
+		       - 4 - 6 - 6),
 		      (htab->elf.splt->contents
-		       + htab->tlsdesc_plt
-		       + htab->lazy_plt->plt0_got2_offset));
+		       + htab->tlsdesc_plt + 4 + 6 + 2));
 	}
     }
 
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 6123078..05223f4 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,11 @@
+2018-03-26  H.J. Lu  <hongjiu.lu@intel.com>
+
+	Backport from master branch
+	2018-03-25  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR ld/23000
+	* testsuite/ld-x86-64/tlsdesc.pd: Updated.
+
 2018-03-20  Roland McGrath  <mcgrathr@google.com>
 
 	* testsuite/ld-elf/elf.exp (pr20995-2): XFAIL on aarch64*-*-elf*,
diff --git a/ld/testsuite/ld-x86-64/tlsdesc.pd b/ld/testsuite/ld-x86-64/tlsdesc.pd
index 0fa36f3..08b4fa3 100644
--- a/ld/testsuite/ld-x86-64/tlsdesc.pd
+++ b/ld/testsuite/ld-x86-64/tlsdesc.pd
@@ -13,7 +13,7 @@ Disassembly of section .plt:
  [0-9a-f]+:	ff 35 .. .. 20 00    	pushq  .*\(%rip\)        # 201358 <_GLOBAL_OFFSET_TABLE_\+0x8>
  [0-9a-f]+:	ff 25 .. .. 20 00    	jmpq   \*.*\(%rip\)        # 201360 <_GLOBAL_OFFSET_TABLE_\+0x10>
  [0-9a-f]+:	0f 1f 40 00          	nopl   0x0\(%rax\)
+ [0-9a-f]+:	f3 0f 1e fa          	endbr64 
  [0-9a-f]+:	ff 35 .. .. 20 00    	pushq  .*\(%rip\)        # 201358 <_GLOBAL_OFFSET_TABLE_\+0x8>
  [0-9a-f]+:	ff 25 .. .. 20 00    	jmpq   \*.*\(%rip\)        # 201348 <.*>
- [0-9a-f]+:	0f 1f 40 00          	nopl   0x0\(%rax\)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]