Index: lld/ELF/Arch/X86.cpp =================================================================== --- lld/ELF/Arch/X86.cpp +++ lld/ELF/Arch/X86.cpp @@ -435,8 +435,11 @@ 0xe8, 0x04, 0x00, 0x00, 0x00, // call next 0xf3, 0x90, // loop: pause 0xeb, 0xfc, // jmp loop; .align 16 - 0x83, 0xc4, 0x04, // next: add $4, %esp - 0x87, 0x04, 0x24, // xchg %eax, (%esp) + 0x89, 0x0c, 0x24, // next: mov %ecx, (%esp) + 0x8b, 0x4c, 0x24, 0x04, // mov 0x4(%esp), %ecx + 0x89, 0x44, 0x24, 0x04, // mov %eax ,0x4(%esp) + 0x89, 0xc8, // mov %ecx, %eax + 0x59, // pop %ecx 0xc3, // ret }; memcpy(Buf, Insn, sizeof(Insn)); @@ -487,8 +490,11 @@ 0xf3, 0x90, // loop: pause 0xeb, 0xfc, // jmp loop 0x90, // nop; .align 16 - 0x83, 0xc4, 0x04, // next: add $4, %esp - 0x87, 0x04, 0x24, // xchg %eax, (%esp) + 0x89, 0x0c, 0x24, // next: mov %ecx, (%esp) + 0x8b, 0x4c, 0x24, 0x04, // mov 0x4(%esp), %ecx + 0x89, 0x44, 0x24, 0x04, // mov %eax ,0x4(%esp) + 0x89, 0xc8, // mov %ecx, %eax + 0x59, // pop %ecx 0xc3, // ret }; memcpy(Buf, PltData, sizeof(PltData)); Index: lld/ELF/Arch/X86_64.cpp =================================================================== --- lld/ELF/Arch/X86_64.cpp +++ lld/ELF/Arch/X86_64.cpp @@ -481,23 +481,20 @@ template Retpoline::Retpoline() { TargetInfo::PltEntrySize = 32; - TargetInfo::PltHeaderSize = 48; + TargetInfo::PltHeaderSize = 32; } template void Retpoline::writeGotPlt(uint8_t *Buf, const Symbol &S) const { - write32le(Buf, S.getPltVA() + 21); + write32le(Buf, S.getPltVA() + 16); } template void Retpoline::writePltHeader(uint8_t *Buf) const { const uint8_t Insn[] = { - 0xff, 0x35, 0, 0, 0, 0, // pushq GOTPLT+8(%rip) 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, // mov GOTPLT+16(%rip), %r11 - 0xe8, 0x0e, 0x00, 0x00, 0x00, // callq next + 0xe8, 0x04, 0x00, 0x00, 0x00, // callq next 0xf3, 0x90, // loop: pause - 0xeb, 0xfc, // jmp loop - 0x0f, 0x1f, 0x44, 0x00, 0x00, // nop - 0x0f, 0x1f, 0x44, 0x00, 0x00, // nop; .align 16 + 0xeb, 0xfc, // jmp loop; .align 16 0x4c, 0x89, 0x1c, 0x24, // next: mov %r11, (%rsp) 0xc3, // ret }; @@ -505,8 +502,7 @@ uint64_t GotPlt = InX::GotPlt->getVA(); uint64_t Plt = InX::Plt->getVA(); - write32le(Buf + 2, GotPlt - Plt + 2); // GOTPLT+8 - write32le(Buf + 9, GotPlt - Plt + 3); // GOTPLT+16 + write32le(Buf + 3, GotPlt - Plt + 16 - 7); } template @@ -515,21 +511,24 @@ unsigned RelOff) const { const uint8_t Insn[] = { 0x4c, 0x8b, 0x1d, 0, 0, 0, 0, // mov foo@GOTPLT(%rip), %r11 - 0xe8, 0x04, 0x00, 0x00, 0x00, // callq next + 0xe8, 0, 0, 0, 0, // callq plt+16 0xf3, 0x90, // loop: pause 0xeb, 0xfc, // jmp loop; .align 16 - 0x4c, 0x89, 0x1c, 0x24, // next: mov %r11, (%rsp) - 0xc3, // ret 0x68, 0, 0, 0, 0, // pushq + 0xff, 0x35, 0, 0, 0, 0, // pushq GOTPLT+8(%rip) 0xe9, 0, 0, 0, 0, // jmpq plt[0] - 0xcc, // int3 }; memcpy(Buf, Insn, sizeof(Insn)); + uint64_t GotPlt = InX::GotPlt->getVA(); + uint64_t Plt = InX::Plt->getVA(); + uint64_t Off = TargetInfo::PltHeaderSize + TargetInfo::PltEntrySize * Index; + write32le(Buf + 3, GotPltEntryAddr - PltEntryAddr - 7); - write32le(Buf + 22, Index); - write32le(Buf + 27, - -Index * TargetInfo::PltEntrySize - TargetInfo::PltHeaderSize - 31); + write32le(Buf + 8, -Off - 12 + 16); + write32le(Buf + 17, Index); + write32le(Buf + 23, GotPlt - Plt - Off + 8 - 27); + write32le(Buf + 28, -Off - 32); } template Index: lld/test/ELF/i386-retpoline-nopic.s =================================================================== --- lld/test/ELF/i386-retpoline-nopic.s +++ lld/test/ELF/i386-retpoline-nopic.s @@ -12,17 +12,12 @@ // CHECK-NEXT: 1101b: f3 90 pause // CHECK-NEXT: 1101d: eb fc jmp -4 <.plt+0xb> // CHECK-NEXT: 1101f: 90 nop -// CHECK-NEXT: 11020: 83 c4 04 addl $4, %esp -// CHECK-NEXT: 11023: 87 04 24 xchgl %eax, (%esp) -// CHECK-NEXT: 11026: c3 retl -// CHECK-NEXT: 11027: cc int3 -// CHECK-NEXT: 11028: cc int3 -// CHECK-NEXT: 11029: cc int3 -// CHECK-NEXT: 1102a: cc int3 -// CHECK-NEXT: 1102b: cc int3 -// CHECK-NEXT: 1102c: cc int3 -// CHECK-NEXT: 1102d: cc int3 -// CHECK-NEXT: 1102e: cc int3 +// CHECK-NEXT: 11020: 89 0c 24 movl %ecx, (%esp) +// CHECK-NEXT: 11023: 8b 4c 24 04 movl 4(%esp), %ecx +// CHECK-NEXT: 11027: 89 44 24 04 movl %eax, 4(%esp) +// CHECK-NEXT: 1102b: 89 c8 movl %ecx, %eax +// CHECK-NEXT: 1102d: 59 popl %ecx +// CHECK-NEXT: 1102e: c3 retl // CHECK-NEXT: 1102f: cc int3 // CHECK-NEXT: 11030: 50 pushl %eax // CHECK-NEXT: 11031: a1 0c 20 01 00 movl 73740, %eax Index: lld/test/ELF/i386-retpoline-pic.s =================================================================== --- lld/test/ELF/i386-retpoline-pic.s +++ lld/test/ELF/i386-retpoline-pic.s @@ -11,17 +11,12 @@ // CHECK-NEXT: 1017: e8 04 00 00 00 calll 4 <.plt+0x10> // CHECK-NEXT: 101c: f3 90 pause // CHECK-NEXT: 101e: eb fc jmp -4 <.plt+0xc> -// CHECK-NEXT: 1020: 83 c4 04 addl $4, %esp -// CHECK-NEXT: 1023: 87 04 24 xchgl %eax, (%esp) -// CHECK-NEXT: 1026: c3 retl -// CHECK-NEXT: 1027: cc int3 -// CHECK-NEXT: 1028: cc int3 -// CHECK-NEXT: 1029: cc int3 -// CHECK-NEXT: 102a: cc int3 -// CHECK-NEXT: 102b: cc int3 -// CHECK-NEXT: 102c: cc int3 -// CHECK-NEXT: 102d: cc int3 -// CHECK-NEXT: 102e: cc int3 +// CHECK-NEXT: 1020: 89 0c 24 movl %ecx, (%esp) +// CHECK-NEXT: 1023: 8b 4c 24 04 movl 4(%esp), %ecx +// CHECK-NEXT: 1027: 89 44 24 04 movl %eax, 4(%esp) +// CHECK-NEXT: 102b: 89 c8 movl %ecx, %eax +// CHECK-NEXT: 102d: 59 popl %ecx +// CHECK-NEXT: 102e: c3 retl // CHECK-NEXT: 102f: cc int3 // CHECK-NEXT: 1030: 50 pushl %eax // CHECK-NEXT: 1031: 8b 83 0c 20 00 00 movl 8204(%ebx), %eax Index: lld/test/ELF/x86-64-retpoline.s =================================================================== --- lld/test/ELF/x86-64-retpoline.s +++ lld/test/ELF/x86-64-retpoline.s @@ -6,44 +6,37 @@ // RUN: ld.lld -shared %t1.o %t2.so -o %t.exe -z retpolineplt // RUN: llvm-objdump -d %t.exe | FileCheck %s -// CHECK: 1010: ff 35 f2 0f 00 00 pushq 4082(%rip) -// CHECK-NEXT: 1016: 4c 8b 1d f3 0f 00 00 movq 4083(%rip), %r11 -// CHECK-NEXT: 101d: e8 0e 00 00 00 callq 14 <.plt+0x20> -// CHECK-NEXT: 1022: f3 90 pause -// CHECK-NEXT: 1024: eb fc jmp -4 <.plt+0x12> -// CHECK-NEXT: 1026: 0f 1f 44 00 00 nopl -// CHECK-NEXT: 102b: 0f 1f 44 00 00 nopl -// CHECK-NEXT: 1030: 4c 89 1c 24 movq %r11, (%rsp) -// CHECK-NEXT: 1034: c3 retq -// CHECK-NEXT: 1035: cc int3 -// CHECK-NEXT: 1036: cc int3 -// CHECK-NEXT: 1037: cc int3 -// CHECK-NEXT: 1038: cc int3 -// CHECK-NEXT: 1039: cc int3 -// CHECK-NEXT: 103a: cc int3 -// CHECK-NEXT: 103b: cc int3 -// CHECK-NEXT: 103c: cc int3 -// CHECK-NEXT: 103d: cc int3 -// CHECK-NEXT: 103e: cc int3 -// CHECK-NEXT: 103f: cc int3 -// CHECK-NEXT: 1040: 4c 8b 1d d1 0f 00 00 movq 4049(%rip), %r11 -// CHECK-NEXT: 1047: e8 04 00 00 00 callq 4 <.plt+0x40> -// CHECK-NEXT: 104c: f3 90 pause -// CHECK-NEXT: 104e: eb fc jmp -4 <.plt+0x3c> -// CHECK-NEXT: 1050: 4c 89 1c 24 movq %r11, (%rsp) -// CHECK-NEXT: 1054: c3 retq -// CHECK-NEXT: 1055: 68 00 00 00 00 pushq $0 -// CHECK-NEXT: 105a: e9 b1 ff ff ff jmp -79 <.plt> -// CHECK-NEXT: 105f: cc int3 -// CHECK-NEXT: 1060: 4c 8b 1d b9 0f 00 00 movq 4025(%rip), %r11 -// CHECK-NEXT: 1067: e8 04 00 00 00 callq 4 <.plt+0x60> -// CHECK-NEXT: 106c: f3 90 pause -// CHECK-NEXT: 106e: eb fc jmp -4 <.plt+0x5c> -// CHECK-NEXT: 1070: 4c 89 1c 24 movq %r11, (%rsp) -// CHECK-NEXT: 1074: c3 retq -// CHECK-NEXT: 1075: 68 01 00 00 00 pushq $1 -// CHECK-NEXT: 107a: e9 91 ff ff ff jmp -111 <.plt> -// CHECK-NEXT: 107f: cc int3 +// CHECK: 1010: 4c 8b 1d f9 0f 00 00 movq 4089(%rip), %r11 +// CHECK-NEXT: 1017: e8 04 00 00 00 callq 4 <.plt+0x10> +// CHECK-NEXT: 101c: f3 90 pause +// CHECK-NEXT: 101e: eb fc jmp -4 <.plt+0xc> +// CHECK-NEXT: 1020: 4c 89 1c 24 movq %r11, (%rsp) +// CHECK-NEXT: 1024: c3 retq +// CHECK-NEXT: 1025: cc int3 +// CHECK-NEXT: 1026: cc int3 +// CHECK-NEXT: 1027: cc int3 +// CHECK-NEXT: 1028: cc int3 +// CHECK-NEXT: 1029: cc int3 +// CHECK-NEXT: 102a: cc int3 +// CHECK-NEXT: 102b: cc int3 +// CHECK-NEXT: 102c: cc int3 +// CHECK-NEXT: 102d: cc int3 +// CHECK-NEXT: 102e: cc int3 +// CHECK-NEXT: 102f: cc int3 +// CHECK-NEXT: 1030: 4c 8b 1d e1 0f 00 00 movq 4065(%rip), %r11 +// CHECK-NEXT: 1037: e8 e4 ff ff ff callq -28 <.plt+0x10> +// CHECK-NEXT: 103c: f3 90 pause +// CHECK-NEXT: 103e: eb fc jmp -4 <.plt+0x2c> +// CHECK-NEXT: 1040: 68 00 00 00 00 pushq $0 +// CHECK-NEXT: 1045: ff 35 bd 0f 00 00 pushq 4029(%rip) +// CHECK-NEXT: 104b: e9 c0 ff ff ff jmp -64 <.plt> +// CHECK-NEXT: 1050: 4c 8b 1d c9 0f 00 00 movq 4041(%rip), %r11 +// CHECK-NEXT: 1057: e8 c4 ff ff ff callq -60 <.plt+0x10> +// CHECK-NEXT: 105c: f3 90 pause +// CHECK-NEXT: 105e: eb fc jmp -4 <.plt+0x4c> +// CHECK-NEXT: 1060: 68 01 00 00 00 pushq $1 +// CHECK-NEXT: 1065: ff 35 9d 0f 00 00 pushq 3997(%rip) +// CHECK-NEXT: 106b: e9 a0 ff ff ff jmp -96 <.plt> .global _start _start: