[llvm-branch-commits] [lld] release/22.x: [ELF] Adjust allowed dynamic relocation types for x86-64 (#182905) (PR #185151)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Mar 6 21:02:43 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld-elf
@llvm/pr-subscribers-lld
Author: Alex Rønne Petersen (alexrp)
<details>
<summary>Changes</summary>
Manual backport of #<!-- -->182905 with partial backport of adf7dbc2a8d28d303e0c539f4e7a23561ed3cf29 in `lld/test/ELF/ztext.s`.
---
Full diff: https://github.com/llvm/llvm-project/pull/185151.diff
4 Files Affected:
- (modified) lld/ELF/Arch/X86_64.cpp (+2-3)
- (removed) lld/test/ELF/Inputs/ztext.s (-10)
- (added) lld/test/ELF/x86-x32-abs.s (+34)
- (modified) lld/test/ELF/ztext.s (+41-19)
``````````diff
diff --git a/lld/ELF/Arch/X86_64.cpp b/lld/ELF/Arch/X86_64.cpp
index 9083b5b9ff250..2c34a193140ea 100644
--- a/lld/ELF/Arch/X86_64.cpp
+++ b/lld/ELF/Arch/X86_64.cpp
@@ -80,7 +80,7 @@ X86_64::X86_64(Ctx &ctx) : TargetInfo(ctx) {
pltRel = R_X86_64_JUMP_SLOT;
relativeRel = R_X86_64_RELATIVE;
iRelativeRel = R_X86_64_IRELATIVE;
- symbolicRel = R_X86_64_64;
+ symbolicRel = ctx.arg.is64 ? R_X86_64_64 : R_X86_64_32;
tlsDescRel = R_X86_64_TLSDESC;
tlsGotRel = R_X86_64_TPOFF64;
tlsModuleIndexRel = R_X86_64_DTPMOD64;
@@ -469,8 +469,7 @@ void X86_64::writePlt(uint8_t *buf, const Symbol &sym,
}
RelType X86_64::getDynRel(RelType type) const {
- if (type == R_X86_64_64 || type == R_X86_64_PC64 || type == R_X86_64_SIZE32 ||
- type == R_X86_64_SIZE64)
+ if (type == symbolicRel || type == R_X86_64_SIZE32 || type == R_X86_64_SIZE64)
return type;
return R_X86_64_NONE;
}
diff --git a/lld/test/ELF/Inputs/ztext.s b/lld/test/ELF/Inputs/ztext.s
deleted file mode 100644
index f66b3ee1e29bf..0000000000000
--- a/lld/test/ELF/Inputs/ztext.s
+++ /dev/null
@@ -1,10 +0,0 @@
- .global bar
- .type bar, @object
- .size bar, 8
-bar:
- .quad 0
-
- .global zed
- .type zed, @function
-zed:
- nop
diff --git a/lld/test/ELF/x86-x32-abs.s b/lld/test/ELF/x86-x32-abs.s
new file mode 100644
index 0000000000000..01fd3b7a5c56c
--- /dev/null
+++ b/lld/test/ELF/x86-x32-abs.s
@@ -0,0 +1,34 @@
+# REQUIRES: x86
+## Test R_X86_64_32 relocations in x32 (ILP32) mode.
+## In x32, R_X86_64_32 is the pointer-sized absolute relocation.
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+# RUN: llvm-mc -filetype=obj -triple=x86_64-gnux32 a.s -o a.o
+# RUN: ld.lld -shared a.o -o a.so
+# RUN: llvm-readelf -r a.so | FileCheck %s
+
+## Non-resolved non-preemptible R_X86_64_32 get R_X86_64_RELATIVE.
+# CHECK: Relocation section '.rela.dyn' at offset {{.*}} contains 2 entries:
+# CHECK: R_X86_64_RELATIVE
+# CHECK-NEXT: {{.*}} R_X86_64_32 {{.*}} und + 0
+
+## R_X86_64_64 is not a supported dynamic relocation in x32 mode.
+# RUN: llvm-mc -filetype=obj -triple=x86_64-gnux32 b.s -o b.o
+# RUN: not ld.lld -shared b.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR
+
+# ERR: error: relocation R_X86_64_64 cannot be used against symbol 'und'; recompile with -fPIC
+# ERR-NEXT: >>> defined in b.o
+# ERR-NEXT: >>> referenced by b.o:(.data+0x0)
+
+#--- a.s
+.globl hid
+.hidden hid
+
+.data
+hid:
+ .long und
+ .long hid
+
+#--- b.s
+.data
+ .quad und
diff --git a/lld/test/ELF/ztext.s b/lld/test/ELF/ztext.s
index 11e89e025e060..1aa4987ccc403 100644
--- a/lld/test/ELF/ztext.s
+++ b/lld/test/ELF/ztext.s
@@ -1,20 +1,34 @@
# REQUIRES: x86
-# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
-# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/ztext.s -o %t2.o
-# RUN: ld.lld %t2.o -o %t2.so -shared -soname=so
+# RUN: rm -rf %t && split-file %s %t && cd %t
+# RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 b.s -o b.o
+# RUN: ld.lld b.o -o b.so -shared -soname=so
-# RUN: ld.lld -z notext %t.o %t2.so -o %t -shared
-# RUN: llvm-readobj --dynamic-table -r %t | FileCheck %s
-# RUN: ld.lld -z notext %t.o %t2.so -o %t2 -pie
-# RUN: llvm-readobj --dynamic-table -r %t2 | FileCheck %s
-# RUN: ld.lld -z notext %t.o %t2.so -o %t3
-# RUN: llvm-readobj --dynamic-table -r %t3 | FileCheck --check-prefix=STATIC %s
+## -z notext allows text relocations for certain relocation types.
+# RUN: ld.lld -z notext a.o b.so -o out -shared
+# RUN: llvm-readobj --dynamic-table -r out | FileCheck %s
+# RUN: ld.lld -z notext a.o b.so -o out.pie -pie
+# RUN: llvm-readobj --dynamic-table -r out.pie | FileCheck %s
+# RUN: ld.lld -z notext a.o b.so -o out.exe
+# RUN: llvm-readobj --dynamic-table -r out.exe | FileCheck --check-prefix=STATIC %s
-# RUN: not ld.lld %t.o %t2.so -o /dev/null -shared 2>&1 | FileCheck --check-prefix=ERR %s
-# RUN: not ld.lld -z text %t.o %t2.so -o /dev/null -shared 2>&1 | FileCheck --check-prefix=ERR %s
-# ERR: error: relocation R_X86_64_64 cannot be used against symbol 'bar'; recompile with -fPIC
+# RUN: not ld.lld a.o b.so -shared 2>&1 | FileCheck --check-prefix=ERR %s --implicit-check-not=error:
+# RUN: not ld.lld -z text a.o b.so -shared 2>&1 | FileCheck --check-prefix=ERR %s --implicit-check-not=error:
-# If the preference is to have text relocations, don't create plt of copy relocations.
+# ERR: error: relocation R_X86_64_64 cannot be used against local symbol; recompile with -fPIC
+# ERR-NEXT: >>> defined in a.o
+# ERR-NEXT: >>> referenced by a.o:(.text+0x0)
+# ERR: error: relocation R_X86_64_64 cannot be used against symbol 'bar'; recompile with -fPIC
+# ERR-NEXT: >>> defined in b.so
+# ERR-NEXT: >>> referenced by a.o:(.text+0x8)
+
+## R_X86_64_PC64 is not a supported dynamic relocation. It errors even with -z notext.
+# RUN: llvm-mc -filetype=obj -triple=x86_64 pc64.s -o pc64.o
+# RUN: not ld.lld -z notext pc64.o b.so -shared 2>&1 | FileCheck --check-prefix=ERR-PC64 %s
+
+# ERR-PC64: error: relocation R_X86_64_PC64 cannot be used against symbol 'bar'; recompile with -fPIC
+# ERR-PC64-NEXT: >>> defined in b.so
+# ERR-PC64-NEXT: >>> referenced by pc64.o:(.text+0x0)
# CHECK: DynamicSection [
# CHECK: FLAGS TEXTREL
@@ -22,9 +36,8 @@
# CHECK: Relocations [
# CHECK-NEXT: Section {{.*}} .rela.dyn {
-# CHECK-NEXT: 0x12A0 R_X86_64_RELATIVE - 0x12A0
-# CHECK-NEXT: 0x12A8 R_X86_64_64 bar 0x0
-# CHECK-NEXT: 0x12B0 R_X86_64_PC64 zed 0x0
+# CHECK-NEXT: 0x1268 R_X86_64_RELATIVE - 0x1268
+# CHECK-NEXT: 0x1270 R_X86_64_64 bar 0x0
# CHECK-NEXT: }
# CHECK-NEXT: ]
@@ -34,12 +47,21 @@
# STATIC: Relocations [
# STATIC-NEXT: Section {{.*}} .rela.dyn {
-# STATIC-NEXT: 0x201290 R_X86_64_64 bar 0x0
-# STATIC-NEXT: 0x201298 R_X86_64_PC64 zed 0x0
+# STATIC-NEXT: 0x201258 R_X86_64_64 bar 0x0
# STATIC-NEXT: }
# STATIC-NEXT: ]
+#--- a.s
foo:
.quad foo
.quad bar
-.quad zed - .
+
+#--- b.s
+.global bar
+.type bar, @object
+.size bar, 8
+bar:
+.quad 0
+
+#--- pc64.s
+.quad bar - .
``````````
</details>
https://github.com/llvm/llvm-project/pull/185151
More information about the llvm-branch-commits
mailing list