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-01-28 12:18:53-07:00
logd7deffee8d1861720ba4f9d3cb6a7f6dfb7ccb33
tree729feabb46efe36be83da943a8e624b48634cda7
parent0e6d2184cacf2dd1fad7508b2f9ae99d78763148

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
......@@ -1121,7 +1121,11 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void {
11211121
11221122 try argv.ensureUnusedCapacity(self.base.options.objects.len);
11231123 for (self.base.options.objects) |obj| {
1124 argv.appendAssumeCapacity(obj.path);
1124 if (obj.must_link) {
1125 argv.appendAssumeCapacity(try allocPrint(arena, "-WHOLEARCHIVE:{s}", .{obj.path}));
1126 } else {
1127 argv.appendAssumeCapacity(obj.path);
1128 }
11251129 }
11261130
11271131 for (comp.c_object_table.keys()) |key| {
src/link/Elf.zig+13-2
......@@ -1732,9 +1732,20 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {
17321732 }
17331733
17341734 // Positional arguments to the linker such as object files.
1735 try argv.ensureUnusedCapacity(self.base.options.objects.len);
1735 var whole_archive = false;
17361736 for (self.base.options.objects) |obj| {
1737 argv.appendAssumeCapacity(obj.path);
1737 if (obj.must_link and !whole_archive) {
1738 try argv.append("-whole-archive");
1739 whole_archive = true;
1740 } else if (!obj.must_link and whole_archive) {
1741 try argv.append("-no-whole-archive");
1742 whole_archive = false;
1743 }
1744 try argv.append(obj.path);
1745 }
1746 if (whole_archive) {
1747 try argv.append("-no-whole-archive");
1748 whole_archive = false;
17381749 }
17391750
17401751 for (comp.c_object_table.keys()) |key| {
src/link/Wasm.zig+13-2
......@@ -1437,9 +1437,20 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
14371437 }
14381438
14391439 // Positional arguments to the linker such as object files.
1440 try argv.ensureUnusedCapacity(self.base.options.objects.len);
1440 var whole_archive = false;
14411441 for (self.base.options.objects) |obj| {
1442 argv.appendAssumeCapacity(obj.path);
1442 if (obj.must_link and !whole_archive) {
1443 try argv.append("-whole-archive");
1444 whole_archive = true;
1445 } else if (!obj.must_link and whole_archive) {
1446 try argv.append("-no-whole-archive");
1447 whole_archive = false;
1448 }
1449 try argv.append(obj.path);
1450 }
1451 if (whole_archive) {
1452 try argv.append("-no-whole-archive");
1453 whole_archive = false;
14431454 }
14441455
14451456 for (comp.c_object_table.keys()) |key| {