[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