[lld-macho] Support X86_64_RELOC_SIGNED_{1,2,4}

We currently only support extern relocations.
`X86_64_RELOC_SIGNED_{1,2,4}` are like X86_64_RELOC_SIGNED, but with the
implicit addend fixed to 1, 2, and 4, respectively.
See the comment in `lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp RecordX86_64Relocation`.

Reviewed By: int3

Differential Revision: https://reviews.llvm.org/D79311
This commit is contained in:
Fangrui Song 2020-05-03 19:25:30 -07:00
parent 156092bbcc
commit 6939fe6e08
2 changed files with 43 additions and 0 deletions

View file

@ -33,6 +33,9 @@ uint64_t X86_64::getImplicitAddend(const uint8_t *loc, uint8_t type) const {
switch (type) {
case X86_64_RELOC_BRANCH:
case X86_64_RELOC_SIGNED:
case X86_64_RELOC_SIGNED_1:
case X86_64_RELOC_SIGNED_2:
case X86_64_RELOC_SIGNED_4:
case X86_64_RELOC_GOT_LOAD:
return read32le(loc);
default:
@ -45,6 +48,9 @@ void X86_64::relocateOne(uint8_t *loc, uint8_t type, uint64_t val) const {
switch (type) {
case X86_64_RELOC_BRANCH:
case X86_64_RELOC_SIGNED:
case X86_64_RELOC_SIGNED_1:
case X86_64_RELOC_SIGNED_2:
case X86_64_RELOC_SIGNED_4:
case X86_64_RELOC_GOT_LOAD:
// These types are only used for pc-relative relocations, so offset by 4
// since the RIP has advanced by 4 at this point.

View file

@ -0,0 +1,37 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o
# RUN: lld -flavor darwinnew -o %t %t.o
# RUN: llvm-objdump -d %t | FileCheck %s
# CHECK: <_main>:
# CHECK-NEXT: movl {{.*}} # 2000 <_s>
# CHECK-NEXT: callq {{.*}}
# CHECK-NEXT: movl {{.*}} # 2002 <_s+0x2>
# CHECK-NEXT: callq {{.*}}
# CHECK-NEXT: movb {{.*}} # 2000 <_s>
# CHECK-NEXT: callq {{.*}}
.section __TEXT,__text
.globl _main
_main:
movl $0x434241, _s(%rip) # X86_64_RELOC_SIGNED_4
callq _f
movl $0x44, _s+2(%rip) # X86_64_RELOC_SIGNED_2
callq _f
movb $0x45, _s(%rip) # X86_64_RELOC_SIGNED_1
callq _f
xorq %rax, %rax
ret
_f:
movl $0x2000004, %eax # write() syscall
mov $1, %rdi # stdout
leaq _s(%rip), %rsi
mov $3, %rdx # length
syscall
ret
.section __DATA,__data
.globl _s
_s:
.space 5