[lld] [lld][WebAssembly] Error on unexptected relocation types in `-pie/`-s… (PR #162117)

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 6 09:54:32 PDT 2025


https://github.com/sbc100 created https://github.com/llvm/llvm-project/pull/162117

…hared` data sections

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

>From 14afa7fcff52e0c422c4ece9ba23e30b37a75e5a Mon Sep 17 00:00:00 2001
From: Sam Clegg <sbc at chromium.org>
Date: Mon, 6 Oct 2025 09:33:18 -0700
Subject: [PATCH] [lld][WebAssembly] Error on unexptected relocation types in
 `-pie/`-shared` data sections

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
---
 lld/test/wasm/bad-data-relocs.s | 27 +++++++++++++++++++++++++++
 lld/wasm/InputChunks.cpp        | 15 +++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 lld/test/wasm/bad-data-relocs.s

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.



More information about the llvm-commits mailing list