[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.
This commit is contained in:
Sam Clegg
2025-04-28 15:30:35 -07:00
committed by GitHub
parent 0e07478a5e
commit afdc4b1526
3 changed files with 11 additions and 6 deletions

View File

@@ -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

View File

@@ -318,10 +318,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);
}

View File

@@ -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();
}