diff --git a/lld/test/wasm/Inputs/start-lib1.s b/lld/test/wasm/Inputs/start-lib1.s index 229f67a4bd897..9ebfdbc2f61e1 100644 --- a/lld/test/wasm/Inputs/start-lib1.s +++ b/lld/test/wasm/Inputs/start-lib1.s @@ -5,3 +5,10 @@ foo: .functype foo () -> () call bar end_function + +# Static constructor inserted here to ensure the object file is not +# being processed as "live". Live object files have their static constructors +# preserved even if no symbol within is used. +.section .init_array,"",@ + .p2align 2 + .int32 foo diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp index de976947474e1..86c4ce397e357 100644 --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -317,10 +317,6 @@ void LinkerDriver::addFile(StringRef path) { if (inWholeArchive) { for (const auto &[m, offset] : members) { auto *object = createObjectFile(m, path, offset); - // Mark object as live; object members are normally not - // live by default but -whole-archive is designed to treat - // them as such. - object->markLive(); files.push_back(object); } diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp index 614cddddd1b19..1d1b82c9879b9 100644 --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -423,8 +423,10 @@ ObjFile::ObjFile(MemoryBufferRef m, StringRef archiveName, bool lazy) // https://github.com/llvm/llvm-project/issues/98778 checkArch(wasmObj->getArch()); - // If this isn't part of an archive, it's eagerly linked, so mark it live. - if (archiveName.empty()) + // Unless we are processing this as a lazy object file (e.g. part of an + // archive file or within `--start-lib`/`--end-lib`, it's eagerly linked, so + // mark it live. + if (!lazy) markLive(); }