diff --git a/src/link/Coff.zig b/src/link/Coff.zig index d6999442bc39c2383a62dcaa3e2d5452af915ffe..300fe4f547902978a791f02f6d4d31af543abd40 100644 --- a/src/link/Coff.zig +++ b/src/link/Coff.zig @@ -1099,7 +1099,11 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void { try argv.ensureUnusedCapacity(self.base.options.objects.len); for (self.base.options.objects) |obj| { - argv.appendAssumeCapacity(obj.path); + if (obj.must_link) { + argv.appendAssumeCapacity(try allocPrint(arena, "-WHOLEARCHIVE:{s}", .{obj.path})); + } else { + argv.appendAssumeCapacity(obj.path); + } } for (comp.c_object_table.keys()) |key| { diff --git a/src/link/Elf.zig b/src/link/Elf.zig index e257abe5bdd564260e53d2cb0cac8c4a86aa46d7..a7fbd2aff511aba6aef04b78260cd09648b6c8ad 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -1622,9 +1622,20 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void { } // Positional arguments to the linker such as object files. - try argv.ensureUnusedCapacity(self.base.options.objects.len); + var whole_archive = false; for (self.base.options.objects) |obj| { - argv.appendAssumeCapacity(obj.path); + if (obj.must_link and !whole_archive) { + try argv.append("-whole-archive"); + whole_archive = true; + } else if (!obj.must_link and whole_archive) { + try argv.append("-no-whole-archive"); + whole_archive = false; + } + try argv.append(obj.path); + } + if (whole_archive) { + try argv.append("-no-whole-archive"); + whole_archive = false; } for (comp.c_object_table.keys()) |key| { diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index a0033a44c7c98e8bdaa48e65721ee55a91b56de4..37f9c2663d2b5f42b3477af3b5efadd5097ab92b 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -1233,9 +1233,20 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void { } // Positional arguments to the linker such as object files. - try argv.ensureUnusedCapacity(self.base.options.objects.len); + var whole_archive = false; for (self.base.options.objects) |obj| { - argv.appendAssumeCapacity(obj.path); + if (obj.must_link and !whole_archive) { + try argv.append("-whole-archive"); + whole_archive = true; + } else if (!obj.must_link and whole_archive) { + try argv.append("-no-whole-archive"); + whole_archive = false; + } + try argv.append(obj.path); + } + if (whole_archive) { + try argv.append("-no-whole-archive"); + whole_archive = false; } for (comp.c_object_table.keys()) |key| {