[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