authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-01-28 12:18:53-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-02-02 22:00:38-07:00
loge9d916571a5eedd4784951d2840ea206107f30e6
tree78501a86fa55a10a2c83b94769668f2ced47885a
parent021c1190af90514aa776ed64515cdaf3cd53b319

link: ELF, COFF, WASM: honor the "must_link" flag of positionals

Previously only the MachO linker was honoring the flag.

3 files changed, 31 insertions(+), 5 deletions(-)

src/link/Coff.zig+5-1
......@@ -1099,7 +1099,11 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void {
10991099
11001100 try argv.ensureUnusedCapacity(self.base.options.objects.len);
11011101 for (self.base.options.objects) |obj| {
1102 argv.appendAssumeCapacity(obj.path);
1102 if (obj.must_link) {
1103 argv.appendAssumeCapacity(try allocPrint(arena, "-WHOLEARCHIVE:{s}", .{obj.path}));
1104 } else {
1105 argv.appendAssumeCapacity(obj.path);
1106 }
11031107 }
11041108
11051109 for (comp.c_object_table.keys()) |key| {
src/link/Elf.zig+13-2
......@@ -1622,9 +1622,20 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {
16221622 }
16231623
16241624 // Positional arguments to the linker such as object files.
1625 try argv.ensureUnusedCapacity(self.base.options.objects.len);
1625 var whole_archive = false;
16261626 for (self.base.options.objects) |obj| {
1627 argv.appendAssumeCapacity(obj.path);
1627 if (obj.must_link and !whole_archive) {
1628 try argv.append("-whole-archive");
1629 whole_archive = true;
1630 } else if (!obj.must_link and whole_archive) {
1631 try argv.append("-no-whole-archive");
1632 whole_archive = false;
1633 }
1634 try argv.append(obj.path);
1635 }
1636 if (whole_archive) {
1637 try argv.append("-no-whole-archive");
1638 whole_archive = false;
16281639 }
16291640
16301641 for (comp.c_object_table.keys()) |key| {
src/link/Wasm.zig+13-2
......@@ -1233,9 +1233,20 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
12331233 }
12341234
12351235 // Positional arguments to the linker such as object files.
1236 try argv.ensureUnusedCapacity(self.base.options.objects.len);
1236 var whole_archive = false;
12371237 for (self.base.options.objects) |obj| {
1238 argv.appendAssumeCapacity(obj.path);
1238 if (obj.must_link and !whole_archive) {
1239 try argv.append("-whole-archive");
1240 whole_archive = true;
1241 } else if (!obj.must_link and whole_archive) {
1242 try argv.append("-no-whole-archive");
1243 whole_archive = false;
1244 }
1245 try argv.append(obj.path);
1246 }
1247 if (whole_archive) {
1248 try argv.append("-no-whole-archive");
1249 whole_archive = false;
12391250 }
12401251
12411252 for (comp.c_object_table.keys()) |key| {