Index: lld/ELF/Target.cpp =================================================================== --- lld/ELF/Target.cpp +++ lld/ELF/Target.cpp @@ -631,6 +631,7 @@ RelExpr X86_64TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const { switch (Type) { + case R_X86_64_8: case R_X86_64_32: case R_X86_64_32S: case R_X86_64_64: @@ -857,6 +858,10 @@ void X86_64TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const { switch (Type) { + case R_X86_64_8: + checkUInt<8>(Loc, Val, Type); + *Loc = Val; + break; case R_X86_64_32: checkUInt<32>(Loc, Val, Type); write32le(Loc, Val); Index: lld/test/ELF/Inputs/x86-64-reloc-8-error.s =================================================================== --- /dev/null +++ lld/test/ELF/Inputs/x86-64-reloc-8-error.s @@ -0,0 +1,3 @@ +.globl foo +.hidden foo +foo = 256 Index: lld/test/ELF/Inputs/x86-64-reloc-8.s =================================================================== --- /dev/null +++ lld/test/ELF/Inputs/x86-64-reloc-8.s @@ -0,0 +1,3 @@ +.globl foo +.hidden foo +foo = 0x42 Index: lld/test/ELF/x86-64-reloc-8.s =================================================================== --- /dev/null +++ lld/test/ELF/x86-64-reloc-8.s @@ -0,0 +1,14 @@ +// REQUIRES: x86 + +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/x86-64-reloc-8.s -o %t1 +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/x86-64-reloc-8-error.s -o %t2 +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t +// RUN: ld.lld -shared %t %t1 -o %t3 + +// CHECK: Contents of section .text: +// CHECK-NEXT: 200000 42 + +// RUN: not ld.lld -shared %t %t2 -o %t4 2>&1 | FileCheck --check-prefix=ERROR %s +// ERROR: relocation R_X86_64_8 out of range + +.byte foo