Commit e9d916571a

Andrew Kelley <andrew@ziglang.org>
2022-01-28 20:18:53
link: ELF, COFF, WASM: honor the "must_link" flag of positionals
Previously only the MachO linker was honoring the flag.
1 parent 021c119
Changed files (3)
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| {
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| {
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| {