From 0191240cbf6f4f1c4194234e58858671532981be Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Mon, 19 Aug 2024 15:18:49 -0700 Subject: [PATCH] [lld][WebAssembly] Ignore local symbols when parsing lazy object files. This was broken back in #78658 when we transitioned away from archive indexes to parsing lazy object files. Fixes: #94077 Fixes: https://github.com/emscripten-core/emscripten/issues/22008 --- lld/test/wasm/archive-local-sym.s | 24 ++++++++++++++++++++++++ lld/wasm/InputFiles.cpp | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 lld/test/wasm/archive-local-sym.s diff --git a/lld/test/wasm/archive-local-sym.s b/lld/test/wasm/archive-local-sym.s new file mode 100644 index 00000000000000..53e95b9bbb1056 --- /dev/null +++ b/lld/test/wasm/archive-local-sym.s @@ -0,0 +1,24 @@ +## Test that local symbols in archive files are ignored. +# RUN: split-file %s %t +# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t/foo.o %t/foo.s +# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t/main.o %t/main.s +# RUN: rm -f %t/libfoo.a +# RUN: llvm-ar rcs %t/libfoo.a %t/foo.o +# RUN: not wasm-ld %t/libfoo.a %t/main.o -o out.wasm 2>&1 | FileCheck %s + +#--- main.s + +.functype foo () -> () + +.globl _start +_start: + .functype _start () -> () + call foo +# CHECK: main.o: undefined symbol: foo + end_function + +#--- foo.s + +foo: + .functype foo () -> () + end_function diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp index 706ee25d5aae27..de8e707ab2b497 100644 --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -392,7 +392,7 @@ void ObjFile::parseLazy() { << wasmObj.get() << "\n"); for (const SymbolRef &sym : wasmObj->symbols()) { const WasmSymbol &wasmSym = wasmObj->getWasmSymbol(sym.getRawDataRefImpl()); - if (!wasmSym.isDefined()) + if (wasmSym.isUndefined() || wasmSym.isBindingLocal()) continue; symtab->addLazy(wasmSym.Info.Name, this); // addLazy() may trigger this->extract() if an existing symbol is an