diff --git a/lld/MachO/Arch/X86_64.cpp b/lld/MachO/Arch/X86_64.cpp --- a/lld/MachO/Arch/X86_64.cpp +++ b/lld/MachO/Arch/X86_64.cpp @@ -33,6 +33,9 @@ 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 @@ 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. diff --git a/lld/test/MachO/x86-64-reloc-signed.s b/lld/test/MachO/x86-64-reloc-signed.s new file mode 100644 --- /dev/null +++ b/lld/test/MachO/x86-64-reloc-signed.s @@ -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_SIGNED4 + callq _f + movl $0x44, _s+2(%rip) # X86_64_RELOC_SIGNED2 + callq _f + movb $0x45, _s(%rip) # X86_64_RELOC_SIGNED1 + 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