Skip to content

Commit

Permalink
[lld][WebAssembly] Ignore local symbols when parsing lazy object file…
Browse files Browse the repository at this point in the history
…s. (#104876)

This was broken back in #78658 when we transitioned away from archive
indexes to parsing lazy object files.

Fixes: #94077
Fixes: emscripten-core/emscripten#22008
  • Loading branch information
sbc100 authored Aug 20, 2024
1 parent ca148b2 commit 5403123
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
24 changes: 24 additions & 0 deletions lld/test/wasm/archive-local-sym.s
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion lld/wasm/InputFiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 5403123

Please sign in to comment.