diff options
-rw-r--r-- | lld/ELF/Target.cpp | 4 | ||||
-rw-r--r-- | lld/test/elf2/aarch64-data-relocs.s | 11 |
2 files changed, 15 insertions, 0 deletions
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 09e9df81896..4f2b0a16ea0 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -628,6 +628,10 @@ void AArch64TargetInfo::relocateOne(uint8_t *Loc, uint8_t *BufEnd, updateAArch64Adr(Loc, (X >> 12) & 0x1FFFFF); // X[32:12] break; } + case R_AARCH64_PREL64: + // No overflow check needed. + write64le(Loc, SA - P); + break; default: error("unrecognized reloc " + Twine(Type)); } diff --git a/lld/test/elf2/aarch64-data-relocs.s b/lld/test/elf2/aarch64-data-relocs.s index bc68d518206..418776d857f 100644 --- a/lld/test/elf2/aarch64-data-relocs.s +++ b/lld/test/elf2/aarch64-data-relocs.s @@ -27,3 +27,14 @@ // CHECK-NEXT: 1006: 24 00 00 00 .word // ^-- A = 0x24 // CHECK-NEXT: 100a: 00 00 00 00 .word + +.section .R_AARCH64_PREL64, "ax",@progbits + .xword sym - . + 36 + +// S + A = 0x24 +// P = 0x100e +// SA - P = 0xfffffffffffff016 +// CHECK: Disassembly of section .R_AARCH64_PREL64: +// CHECK-NEXT: $d.3: +// CHECK-NEXT: 100e: 16 f0 ff ff .word +// CHECK-NEXT: 1012: ff ff ff ff .word |