[lld][WebAssembly] Don't mark `--start-lib`/`--end-lib` files as live (#137714)
Without this change files in `--start-lib`/`--end-lib` groups were being
marked as live, which means there static constructors were being
included in the link.
diff --git a/lld/test/wasm/Inputs/start-lib1.s b/lld/test/wasm/Inputs/start-lib1.s
index 229f67a..9ebfdbc 100644
--- a/lld/test/wasm/Inputs/start-lib1.s
+++ b/lld/test/wasm/Inputs/start-lib1.s
@@ -5,3 +5,10 @@
.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 80e9a3e..d222615 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -318,10 +318,6 @@
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 614cddd..1d1b82c9 100644
--- a/lld/wasm/InputFiles.cpp
+++ b/lld/wasm/InputFiles.cpp
@@ -423,8 +423,10 @@
// 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();
}