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 {...@@ -1121,7 +1121,11 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void {
11211121
1122 try argv.ensureUnusedCapacity(self.base.options.objects.len);1122 try argv.ensureUnusedCapacity(self.base.options.objects.len);
1123 for (self.base.options.objects) |obj| {1123 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 }
1125 }1129 }
11261130
1127 for (comp.c_object_table.keys()) |key| {1131 for (comp.c_object_table.keys()) |key| {
src/link/Elf.zig+13-2
...@@ -1732,9 +1732,20 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {...@@ -1732,9 +1732,20 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {
1732 }1732 }
17331733
1734 // Positional arguments to the linker such as object files.1734 // Positional arguments to the linker such as object files.
1735 try argv.ensureUnusedCapacity(self.base.options.objects.len);1735 var whole_archive = false;
1736 for (self.base.options.objects) |obj| {1736 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;
1738 }1749 }
17391750
1740 for (comp.c_object_table.keys()) |key| {1751 for (comp.c_object_table.keys()) |key| {
src/link/Wasm.zig+13-2
...@@ -1437,9 +1437,20 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {...@@ -1437,9 +1437,20 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
1437 }1437 }
14381438
1439 // Positional arguments to the linker such as object files.1439 // Positional arguments to the linker such as object files.
1440 try argv.ensureUnusedCapacity(self.base.options.objects.len);1440 var whole_archive = false;
1441 for (self.base.options.objects) |obj| {1441 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;
1443 }1454 }
14441455
1445 for (comp.c_object_table.keys()) |key| {1456 for (comp.c_object_table.keys()) |key| {