From 3f65a783f2064a9040f8fcbfddfc3072c52493d8 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Fri, 15 Aug 2025 17:15:22 +0900 Subject: [PATCH 1/4] [lld][WebAssembly] Do not relocate ABSOLUTE symbols Fixes https://github.com/llvm/llvm-project/issues/153759 --- lld/wasm/SyntheticSections.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lld/wasm/SyntheticSections.cpp b/lld/wasm/SyntheticSections.cpp index e1192706ea913..6c1c4391ea0d7 100644 --- a/lld/wasm/SyntheticSections.cpp +++ b/lld/wasm/SyntheticSections.cpp @@ -442,6 +442,8 @@ void GlobalSection::generateRelocationCode(raw_ostream &os, bool TLS) const { for (const Symbol *sym : internalGotSymbols) { if (TLS != sym->isTLS()) continue; + if (sym->flags & WASM_SYMBOL_ABSOLUTE) + continue; if (auto *d = dyn_cast(sym)) { // Get __memory_base @@ -503,7 +505,8 @@ void GlobalSection::writeBody() { bool useExtendedConst = false; uint32_t globalIdx; int64_t offset; - if (ctx.arg.extendedConst && ctx.isPic) { + if (ctx.arg.extendedConst && ctx.isPic && + (sym->flags & WASM_SYMBOL_ABSOLUTE) == 0) { if (auto *d = dyn_cast(sym)) { if (!sym->isTLS()) { globalIdx = ctx.sym.memoryBase->getGlobalIndex(); From 7cdff15342a8645701fdc1a690a4dc210fb491d6 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Mon, 18 Aug 2025 10:08:15 +0900 Subject: [PATCH 2/4] add a test --- lld/test/wasm/pie.s | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/lld/test/wasm/pie.s b/lld/test/wasm/pie.s index 21eac79207318..cac54f887e417 100644 --- a/lld/test/wasm/pie.s +++ b/lld/test/wasm/pie.s @@ -2,7 +2,7 @@ # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-emscripten %S/Inputs/internal_func.s -o %t.internal_func.o # RUN: wasm-ld --no-gc-sections --experimental-pic -pie --unresolved-symbols=import-dynamic -o %t.wasm %t.o %t.internal_func.o # RUN: obj2yaml %t.wasm | FileCheck %s -# RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_apply_data_relocs --no-show-raw-insn --no-leading-addr %t.wasm | FileCheck %s --check-prefixes DISASSEM +# RUN: llvm-objdump --disassemble-symbols=__wasm_call_ctors,__wasm_apply_data_relocs,__wasm_apply_global_relocs --no-show-raw-insn --no-leading-addr %t.wasm | FileCheck %s --check-prefixes DISASSEM .functype external_func () -> () .functype internal_func1 () -> (i32) @@ -41,6 +41,11 @@ foo: drop global.get __stack_pointer + i32.load 0 + call_indirect () -> (i32) + drop + + global.get __wasm_first_page_end@GOT end_function get_data_address: @@ -145,6 +150,18 @@ _start: # DISASSEM-LABEL: <__wasm_apply_data_relocs>: # DISASSEM: end +# global 6 is __wasm_first_page_end, which is ABSOLUTE and +# thus should not be relocated. +# +# DISASSEM-LABEL: <__wasm_apply_global_relocs>: +# DISASSEM: global.set 4 +# DISASSEM: global.set 5 +# DISASSEM-NOT: global.set 6 +# DISASSEM: global.set 7 +# DISASSEM: global.set 8 +# DISASSEM: global.set 9 +# DISASSEM: end + # Run the same test with extended-const support. When this is available # we don't need __wasm_apply_global_relocs and instead rely on the add # instruction in the InitExpr. We also, therefore, do not need these globals @@ -173,17 +190,23 @@ _start: # EXTENDED-CONST-NEXT: Type: I32 # EXTENDED-CONST-NEXT: Mutable: false # EXTENDED-CONST-NEXT: InitExpr: +# EXTENDED-CONST-NEXT: Opcode: I32_CONST +# EXTENDED-CONST-NEXT: Value: 65536 +# EXTENDED-CONST-NEXT: - Index: 7 +# EXTENDED-CONST-NEXT: Type: I32 +# EXTENDED-CONST-NEXT: Mutable: false +# EXTENDED-CONST-NEXT: InitExpr: # EXTENDED-CONST-NEXT: Extended: true # This instruction sequence decodes to: # (global.get[0x23] 0x1 i32.const[0x41] 0x0C i32.add[0x6A] end[0x0b]) # EXTENDED-CONST-NEXT: Body: 2301410C6A0B -# EXTENDED-CONST-NEXT: - Index: 7 +# EXTENDED-CONST-NEXT: - Index: 8 # EXTENDED-CONST-NEXT: Type: I32 # EXTENDED-CONST-NEXT: Mutable: false # EXTENDED-CONST-NEXT: InitExpr: # EXTENDED-CONST-NEXT: Opcode: GLOBAL_GET # EXTENDED-CONST-NEXT: Index: 2 -# EXTENDED-CONST-NEXT: - Index: 8 +# EXTENDED-CONST-NEXT: - Index: 9 # EXTENDED-CONST-NEXT: Type: I32 # EXTENDED-CONST-NEXT: Mutable: false # EXTENDED-CONST-NEXT: InitExpr: From 08fde9693e0fe06e8530312331790a4107acad83 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Mon, 18 Aug 2025 10:24:10 +0900 Subject: [PATCH 3/4] check ABSOLUTE before TLS --- lld/wasm/SyntheticSections.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lld/wasm/SyntheticSections.cpp b/lld/wasm/SyntheticSections.cpp index 6c1c4391ea0d7..e26f818fc2ca0 100644 --- a/lld/wasm/SyntheticSections.cpp +++ b/lld/wasm/SyntheticSections.cpp @@ -440,10 +440,10 @@ void GlobalSection::generateRelocationCode(raw_ostream &os, bool TLS) const { : WASM_OPCODE_I32_ADD; for (const Symbol *sym : internalGotSymbols) { - if (TLS != sym->isTLS()) - continue; if (sym->flags & WASM_SYMBOL_ABSOLUTE) continue; + if (TLS != sym->isTLS()) + continue; if (auto *d = dyn_cast(sym)) { // Get __memory_base From 7c137aa1954a6a25275b9f3be62b3db6900570b5 Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Tue, 19 Aug 2025 13:41:37 +0900 Subject: [PATCH 4/4] lld/test/wasm/pie.s: simplify a bit --- lld/test/wasm/pie.s | 2 -- 1 file changed, 2 deletions(-) diff --git a/lld/test/wasm/pie.s b/lld/test/wasm/pie.s index cac54f887e417..433958e149d8f 100644 --- a/lld/test/wasm/pie.s +++ b/lld/test/wasm/pie.s @@ -41,8 +41,6 @@ foo: drop global.get __stack_pointer - i32.load 0 - call_indirect () -> (i32) drop global.get __wasm_first_page_end@GOT