From 1fa3c728b9812cd38cd97a5ecfa2ef05feee7f6c Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Fri, 25 May 2018 21:14:45 +0000 Subject: [PATCH] Fix retpoline PLT for x86-64 when used for >4GB address. Previously, we wrote only the least significant 32 bits. llvm-svn: 333313 --- lld/ELF/Arch/X86_64.cpp | 2 +- lld/test/ELF/x86-64-plt-high-addr.s | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lld/ELF/Arch/X86_64.cpp b/lld/ELF/Arch/X86_64.cpp index 605e2c19982f..8fd28d3bb278 100644 --- a/lld/ELF/Arch/X86_64.cpp +++ b/lld/ELF/Arch/X86_64.cpp @@ -497,7 +497,7 @@ template Retpoline::Retpoline() { template void Retpoline::writeGotPlt(uint8_t *Buf, const Symbol &S) const { - write32le(Buf, S.getPltVA() + 17); + write64le(Buf, S.getPltVA() + 17); } template void Retpoline::writePltHeader(uint8_t *Buf) const { diff --git a/lld/test/ELF/x86-64-plt-high-addr.s b/lld/test/ELF/x86-64-plt-high-addr.s index 0626abd31aec..4acccb63f4a7 100644 --- a/lld/test/ELF/x86-64-plt-high-addr.s +++ b/lld/test/ELF/x86-64-plt-high-addr.s @@ -4,13 +4,21 @@ // RUN: ld.lld -o %t.so -shared %t1.o // RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t2.o -// RUN: ld.lld -o %t.exe %t2.o %t.so -image-base=0xcafe00000000 -// RUN: llvm-objdump -s -j .got.plt %t.exe | FileCheck %s +// RUN: ld.lld -o %t1.exe %t2.o %t.so -image-base=0xcafe00000000 +// RUN: llvm-objdump -s -j .got.plt %t1.exe | FileCheck %s // CHECK: Contents of section .got.plt: // CHECK-NEXT: cafe00002000 00300000 feca0000 00000000 00000000 // CHECK-NEXT: cafe00002010 00000000 00000000 26100000 feca0000 +// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t2.o +// RUN: ld.lld -o %t2.exe %t2.o %t.so -image-base=0xcafe00000000 -z retpolineplt +// RUN: llvm-objdump -s -j .got.plt %t2.exe | FileCheck -check-prefix=RETPOLINE %s + +// RETPOLINE: Contents of section .got.plt: +// RETPOLINE-NEXT: cafe00002000 00300000 feca0000 00000000 00000000 +// RETPOLINE-NEXT: cafe00002010 00000000 00000000 51100000 feca0000 + .global _start _start: jmp bar@PLT