| author | |
| committer | |
| log | d7deffee8d1861720ba4f9d3cb6a7f6dfb7ccb33 |
| tree | 729feabb46efe36be83da943a8e624b48634cda7 |
| parent | 0e6d2184cacf2dd1fad7508b2f9ae99d78763148 |
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 { |
| 1121 | 1121 | ||
| 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 | } |
| 1126 | 1130 | ||
| 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 | } |
| 1733 | 1733 | ||
| 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 | } |
| 1739 | 1750 | ||
| 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 | } |
| 1438 | 1438 | ||
| 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 | } |
| 1444 | 1455 | ||
| 1445 | for (comp.c_object_table.keys()) |key| { | 1456 | for (comp.c_object_table.keys()) |key| { |