[lld] [lld][WebAssembly] Error on unexptected relocation types in `-pie/`-shared` data sections (PR #162117)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 6 09:55:05 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld-wasm
Author: Sam Clegg (sbc100)
<details>
<summary>Changes</summary>
Most likely we do want to support R_WASM_FUNCTION_INDEX_I32 at some point but this relocation types (along with many others) is not currently supported by `InputChunk::generateRelocationCode`.
See #<!-- -->146923
---
Full diff: https://github.com/llvm/llvm-project/pull/162117.diff
2 Files Affected:
- (added) lld/test/wasm/bad-data-relocs.s (+27)
- (modified) lld/wasm/InputChunks.cpp (+15)
``````````diff
diff --git a/lld/test/wasm/bad-data-relocs.s b/lld/test/wasm/bad-data-relocs.s
new file mode 100644
index 0000000000000..4292d67eee0c8
--- /dev/null
+++ b/lld/test/wasm/bad-data-relocs.s
@@ -0,0 +1,27 @@
+## Certain relocations types are not supported by runtime relocation code
+## generated in `-shared/`-pie` binaries.
+
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+# RUN: not wasm-ld -pie --experimental-pic %t.o -o %t.wasm 2>&1 | FileCheck %s
+
+# CHECK: wasm-ld: error: invalid relocation type in data section: R_WASM_FUNCTION_INDEX_I32
+
+foo:
+ .functype foo (i32) -> ()
+ end_function
+
+.globl _start
+_start:
+ .functype _start () -> ()
+ i32.const bar at GOT
+ call foo at GOT
+ end_function
+
+# data section containing relocation type that is not valid in a data section
+.section .data,"",@
+.globl bar
+bar:
+ .int32 0
+ .size bar, 4
+
+.reloc bar, R_WASM_FUNCTION_INDEX_I32, foo
diff --git a/lld/wasm/InputChunks.cpp b/lld/wasm/InputChunks.cpp
index 181221a77b106..f5e9c4a04a48f 100644
--- a/lld/wasm/InputChunks.cpp
+++ b/lld/wasm/InputChunks.cpp
@@ -406,6 +406,16 @@ uint64_t InputChunk::getVA(uint64_t offset) const {
return (outputSeg ? outputSeg->startVA : 0) + getChunkOffset(offset);
}
+bool isValidRuntimeRelocation(WasmRelocType type) {
+ // TODO(https://github.com/llvm/llvm-project/issues/146923): Add
+ // R_WASM_FUNCTION_INDEX_I32 to this list
+ return type == R_WASM_TABLE_INDEX_I32 ||
+ type == R_WASM_TABLE_INDEX_I64 ||
+ type == R_WASM_MEMORY_ADDR_LOCREL_I32 ||
+ type == R_WASM_MEMORY_ADDR_I32 ||
+ type == R_WASM_MEMORY_ADDR_I64;
+}
+
// Generate code to apply relocations to the data section at runtime.
// This is only called when generating shared libraries (PIC) where address are
// not known at static link time.
@@ -426,6 +436,11 @@ bool InputChunk::generateRelocationCode(raw_ostream &os) const {
for (const WasmRelocation &rel : relocations) {
uint64_t offset = getVA(rel.Offset) - getInputSectionOffset();
+ if (!isValidRuntimeRelocation(rel.getType())) {
+ error("invalid relocation type in data section: " + relocTypetoString(rel.Type));
+ }
+
+
Symbol *sym = file->getSymbol(rel);
// Runtime relocations are needed when we don't know the address of
// a symbol statically.
``````````
</details>
https://github.com/llvm/llvm-project/pull/162117
More information about the llvm-commits
mailing list