summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Target.cpp4
-rw-r--r--lld/test/elf2/aarch64-data-relocs.s11
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
OpenPOWER on IntegriCloud