Detect invalid use of R_X86_64_GOTTPOFF.

It is an ABI requirement that the relocation must be used
in MOVQ or LEAQ instructions. Previously, we ignored invalid
relocations.

llvm-svn: 273248
This commit is contained in:
Rui Ueyama 2016-06-21 06:03:28 +00:00
parent fde8f9bd82
commit 03a6cec51e
3 changed files with 34 additions and 38 deletions

View File

@ -707,6 +707,8 @@ void X86_64TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type,
// "movq foo@gottpoff(%rip),%reg" -> "movq $foo,%reg" // "movq foo@gottpoff(%rip),%reg" -> "movq $foo,%reg"
memcpy(Inst, "\x48\xc7", 2); memcpy(Inst, "\x48\xc7", 2);
*RegSlot = 0xc0 | Reg; *RegSlot = 0xc0 | Reg;
} else {
fatal("R_X86_64_GOTTPOFF must be used in MOVQ or ADDQ instructions only");
} }
// The original code used a PC relative relocation. // The original code used a PC relative relocation.

View File

@ -7,4 +7,4 @@
.globl _start,tlsvar .globl _start,tlsvar
_start: _start:
movl tlsvar@GOTTPOFF(%rip),%edx movq tlsvar@GOTTPOFF(%rip),%rdx

View File

@ -6,8 +6,7 @@
// NORELOC: Relocations [ // NORELOC: Relocations [
// NORELOC-NEXT: ] // NORELOC-NEXT: ]
// DISASM: Disassembly of section .text: // DISASM: _start:
// DISASM-NEXT: _start:
// DISASM-NEXT: 11000: 48 c7 c0 f8 ff ff ff movq $-8, %rax // DISASM-NEXT: 11000: 48 c7 c0 f8 ff ff ff movq $-8, %rax
// DISASM-NEXT: 11007: 49 c7 c7 f8 ff ff ff movq $-8, %r15 // DISASM-NEXT: 11007: 49 c7 c7 f8 ff ff ff movq $-8, %r15
// DISASM-NEXT: 1100e: 48 8d 80 f8 ff ff ff leaq -8(%rax), %rax // DISASM-NEXT: 1100e: 48 8d 80 f8 ff ff ff leaq -8(%rax), %rax
@ -20,24 +19,24 @@
// DISASM-NEXT: 1103f: 4d 8d bf fc ff ff ff leaq -4(%r15), %r15 // DISASM-NEXT: 1103f: 4d 8d bf fc ff ff ff leaq -4(%r15), %r15
// DISASM-NEXT: 11046: 48 81 c4 fc ff ff ff addq $-4, %rsp // DISASM-NEXT: 11046: 48 81 c4 fc ff ff ff addq $-4, %rsp
// DISASM-NEXT: 1104d: 49 81 c4 fc ff ff ff addq $-4, %r12 // DISASM-NEXT: 1104d: 49 81 c4 fc ff ff ff addq $-4, %r12
// DISASM-NEXT: 11054: 48 87 05 f8 ff ff ff xchgq %rax, -8(%rip)
// DISASM-NEXT: 1105b: 48 d1 24 25 fc ff ff ff shlq -4
// DISASM-NEXT: 11063: 48 d1 04 25 fc ff ff ff rolq -4
// LD to LE: // LD to LE:
// DISASM-NEXT: 1106b: 66 66 66 64 48 8b 04 25 00 00 00 00 movq %fs:0, %rax // DISASM-NEXT: 11054: 66 66 66 64 48 8b 04 25 00 00 00 00 movq %fs:0, %rax
// DISASM-NEXT: 11077: 48 8d 88 f8 ff ff ff leaq -8(%rax), %rcx // DISASM-NEXT: 11060: 48 8d 88 f8 ff ff ff leaq -8(%rax), %rcx
// DISASM-NEXT: 1107e: 66 66 66 64 48 8b 04 25 00 00 00 00 movq %fs:0, %rax // DISASM-NEXT: 11067: 66 66 66 64 48 8b 04 25 00 00 00 00 movq %fs:0, %rax
// DISASM-NEXT: 1108a: 48 8d 88 fc ff ff ff leaq -4(%rax), %rcx // DISASM-NEXT: 11073: 48 8d 88 fc ff ff ff leaq -4(%rax), %rcx
// GD to LE: // GD to LE:
// DISASM-NEXT: 11091: 64 48 8b 04 25 00 00 00 00 movq %fs:0, %rax // DISASM-NEXT: 1107a: 64 48 8b 04 25 00 00 00 00 movq %fs:0, %rax
// DISASM-NEXT: 1109a: 48 8d 80 f8 ff ff ff leaq -8(%rax), %rax // DISASM-NEXT: 11083: 48 8d 80 f8 ff ff ff leaq -8(%rax), %rax
// DISASM-NEXT: 110a1: 64 48 8b 04 25 00 00 00 00 movq %fs:0, %rax // DISASM-NEXT: 1108a: 64 48 8b 04 25 00 00 00 00 movq %fs:0, %rax
// DISASM-NEXT: 110aa: 48 8d 80 fc ff ff ff leaq -4(%rax), %rax // DISASM-NEXT: 11093: 48 8d 80 fc ff ff ff leaq -4(%rax), %rax
// LD to LE (2):
// LD to LE:
// DISASM: _DTPOFF64_1: // DISASM: _DTPOFF64_1:
// DISASM-NEXT: 110b1: f8 // DISASM-NEXT: 1109a: f8 clc
// DISASM: _DTPOFF64_2: // DISASM: _DTPOFF64_2:
// DISASM-NEXT: 110ba: fc // DISASM-NEXT: 110a3: fc cld
.type tls0,@object .type tls0,@object
.section .tbss,"awT",@nobits .section .tbss,"awT",@nobits
@ -70,12 +69,7 @@ _start:
addq tls1@GOTTPOFF(%rip), %rsp addq tls1@GOTTPOFF(%rip), %rsp
addq tls1@GOTTPOFF(%rip), %r12 addq tls1@GOTTPOFF(%rip), %r12
//Invalid input case: // LD to LE
xchgq tls0@gottpoff(%rip),%rax
shlq tls0@gottpoff
rolq tls0@gottpoff
//LD to LE:
leaq tls0@tlsld(%rip), %rdi leaq tls0@tlsld(%rip), %rdi
callq __tls_get_addr@PLT callq __tls_get_addr@PLT
leaq tls0@dtpoff(%rax),%rcx leaq tls0@dtpoff(%rax),%rcx
@ -83,7 +77,7 @@ _start:
callq __tls_get_addr@PLT callq __tls_get_addr@PLT
leaq tls1@dtpoff(%rax),%rcx leaq tls1@dtpoff(%rax),%rcx
//GD to LE: // GD to LE
.byte 0x66 .byte 0x66
leaq tls0@tlsgd(%rip),%rdi leaq tls0@tlsgd(%rip),%rdi
.word 0x6666 .word 0x6666
@ -95,7 +89,7 @@ _start:
rex64 rex64
call __tls_get_addr@plt call __tls_get_addr@plt
//LD to LE (2): // LD to LE
_DTPOFF64_1: _DTPOFF64_1:
.quad tls0@DTPOFF .quad tls0@DTPOFF
nop nop