[lld] [lld] Properly diagnose R_AARCH64_PREL32 overflow (PR #205963)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 25 20:09:42 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld-elf
Author: Arthur Eubanks (aeubanks)
<details>
<summary>Changes</summary>
The range is +/-2GB, not +4GB/-2GB. We were silently truncating when the value was between 2 and 4GB.
---
Full diff: https://github.com/llvm/llvm-project/pull/205963.diff
2 Files Affected:
- (modified) lld/ELF/Arch/AArch64.cpp (+1-1)
- (modified) lld/test/ELF/aarch64-prel32.s (+5-5)
``````````diff
diff --git a/lld/ELF/Arch/AArch64.cpp b/lld/ELF/Arch/AArch64.cpp
index 6ec3961158fe0..c8a0da07ea82f 100644
--- a/lld/ELF/Arch/AArch64.cpp
+++ b/lld/ELF/Arch/AArch64.cpp
@@ -623,7 +623,6 @@ void AArch64::relocate(uint8_t *loc, const Relocation &rel,
write16(ctx, loc, val);
break;
case R_AARCH64_ABS32:
- case R_AARCH64_PREL32:
checkIntUInt(ctx, loc, val, 32, rel);
write32(ctx, loc, val);
break;
@@ -633,6 +632,7 @@ void AArch64::relocate(uint8_t *loc, const Relocation &rel,
write32le(loc, val);
}
break;
+ case R_AARCH64_PREL32:
case R_AARCH64_PLT32:
case R_AARCH64_GOTPCREL32:
checkInt(ctx, loc, val, 32, rel);
diff --git a/lld/test/ELF/aarch64-prel32.s b/lld/test/ELF/aarch64-prel32.s
index 3471467279980..84ffddb02867a 100644
--- a/lld/test/ELF/aarch64-prel32.s
+++ b/lld/test/ELF/aarch64-prel32.s
@@ -14,7 +14,7 @@
// RUN: llvm-objdump -s --section=.data a.be | FileCheck %s --check-prefixes=CHECK,BE
// CHECK: Contents of section .data:
-// 202158: S = 0x100, A = 0x100202057, P = 0x202158
+// 202158: S = 0x100, A = 0x202057, P = 0x202158
// S + A - P = 0xffffffff
// 20215c: S = 0x100, A = -0x7fdfdfa4, P = 0x20215c
// S + A - P = 0x80000000
@@ -22,13 +22,13 @@
// BE-NEXT: 202158 ffffffff 80000000
// RUN: not ld.lld -z max-page-size=4096 a.o --defsym foo=255 2>&1 | FileCheck %s --check-prefix=OVERFLOW1 --implicit-check-not=error:
-// OVERFLOW1: error: a.o:(.data+0x4): relocation R_AARCH64_PREL32 out of range: -2147483649 is not in [-2147483648, 4294967295]; references 'foo'
+// OVERFLOW1: error: a.o:(.data+0x4): relocation R_AARCH64_PREL32 out of range: -2147483649 is not in [-2147483648, 2147483647]; references 'foo'
-// RUN: not ld.lld -z max-page-size=4096 a.o --defsym foo=257 2>&1 | FileCheck %s --check-prefix=OVERFLOW2 --implicit-check-not=error:
-// OVERFLOW2: error: a.o:(.data+0x0): relocation R_AARCH64_PREL32 out of range: 4294967296 is not in [-2147483648, 4294967295]; references 'foo'
+// RUN: not ld.lld -z max-page-size=4096 a.o --defsym foo=2147483905 2>&1 | FileCheck %s --check-prefix=OVERFLOW2 --implicit-check-not=error:
+// OVERFLOW2: error: a.o:(.data+0x0): relocation R_AARCH64_PREL32 out of range: 2147483648 is not in [-2147483648, 2147483647]; references 'foo'
.globl _start
_start:
.data
- .word foo - . + 0x100202057
+ .word foo - . + 0x202057
.word foo - . - 0x7fdfdfa4
``````````
</details>
https://github.com/llvm/llvm-project/pull/205963
More information about the llvm-commits
mailing list