Index: ELF/Target.cpp =================================================================== --- ELF/Target.cpp +++ ELF/Target.cpp @@ -364,6 +364,7 @@ return R_TLSLD; case R_386_PLT32: return R_PLT_PC; + case R_386_PC8: case R_386_PC16: case R_386_PC32: return R_PC; @@ -478,6 +479,9 @@ switch (Type) { default: return 0; + case R_386_8: + case R_386_PC8: + return read(Buf); case R_386_16: case R_386_PC16: return read16le(Buf); @@ -497,13 +501,14 @@ uint64_t Val) const { checkInt<32>(Loc, Val, Type); - // R_386_PC16 and R_386_16 are not part of the current i386 psABI. They are - // used by 16-bit x86 objects, like boot loaders. - if (Type == R_386_16 || Type == R_386_PC16) { + // R_386_*8, R_386_*16 relocations are not part of the current i386 psABI. + // They are used by 16-bit x86 objects, like boot loaders. + if (Type == R_386_8 || Type == R_386_PC8) + write(Loc, Val); + else if (Type == R_386_16 || Type == R_386_PC16) write16le(Loc, Val); - return; - } - write32le(Loc, Val); + else + write32le(Loc, Val); } void X86TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, Index: test/ELF/Inputs/i386-pc8.s =================================================================== --- test/ELF/Inputs/i386-pc8.s +++ test/ELF/Inputs/i386-pc8.s @@ -0,0 +1,2 @@ +.global und +und: Index: test/ELF/i386-pc8.s =================================================================== --- test/ELF/i386-pc8.s +++ test/ELF/i386-pc8.s @@ -0,0 +1,17 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux-gnu %s -o %t1.o +# RUN: llvm-mc -filetype=obj -triple=i386-pc-linux-gnu %S/Inputs/i386-pc8.s -o %t2.o +# RUN: ld.lld %t1.o %t2.o -o %t.out +# RUN: llvm-objdump -s -section=.text %t.out | FileCheck %s + +# CHECK: Contents of section .text: +# CHECK-NEXT: 11000 15263344 + +.text +.global foo +foo: + +.byte und-foo+0x11 +.byte und-foo+0x22 +.byte foo+0x33 +.byte foo+0x44