diff options
| -rw-r--r-- | lld/ELF/Arch/X86_64.cpp | 4 | ||||
| -rw-r--r-- | lld/test/ELF/x86-64-pcrel.s | 21 |
2 files changed, 25 insertions, 0 deletions
diff --git a/lld/ELF/Arch/X86_64.cpp b/lld/ELF/Arch/X86_64.cpp index 86368631109..c423f376118 100644 --- a/lld/ELF/Arch/X86_64.cpp +++ b/lld/ELF/Arch/X86_64.cpp @@ -101,6 +101,8 @@ RelExpr X86_64<ELFT>::getRelExpr(RelType Type, const Symbol &S, return R_SIZE; case R_X86_64_PLT32: return R_PLT_PC; + case R_X86_64_PC8: + case R_X86_64_PC16: case R_X86_64_PC32: case R_X86_64_PC64: return R_PC; @@ -319,10 +321,12 @@ template <class ELFT> void X86_64<ELFT>::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const { switch (Type) { case R_X86_64_8: + case R_X86_64_PC8: checkUInt(Loc, Val, 8, Type); *Loc = Val; break; case R_X86_64_16: + case R_X86_64_PC16: checkUInt(Loc, Val, 16, Type); write16le(Loc, Val); break; diff --git a/lld/test/ELF/x86-64-pcrel.s b/lld/test/ELF/x86-64-pcrel.s new file mode 100644 index 00000000000..dd62242e99f --- /dev/null +++ b/lld/test/ELF/x86-64-pcrel.s @@ -0,0 +1,21 @@ +// REQUIRES: x86 + +// This is a test for R_X86_64_PC8 and R_X86_64_PC16. + +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t1.o +// RUN: echo '.globl foo; foo:' | llvm-mc -filetype=obj -triple=x86_64-pc-linux - -o %t2.o +// RUN: ld.lld -o %t.exe %t1.o %t2.o +// RUN: llvm-objdump -s %t.exe | FileCheck %s + +// CHECK: Contents of section .text: +// CHECK: 2000cccc cccccccc cccccccc cccccccc +// CHECK: 20cccccc cccccccc cccccccc cccccccc + +.globl _start +_start: + +.word foo - _start +.fill 14,1,0xcc + +.byte foo - _start +.fill 15,1,0xcc |

