diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-01-28 12:18:53 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-01-28 12:18:53 -0700 |
| commit | d7deffee8d1861720ba4f9d3cb6a7f6dfb7ccb33 (patch) | |
| tree | 729feabb46efe36be83da943a8e624b48634cda7 /src | |
| parent | 0e6d2184cacf2dd1fad7508b2f9ae99d78763148 (diff) | |
| download | zig-d7deffee8d1861720ba4f9d3cb6a7f6dfb7ccb33.tar.gz zig-d7deffee8d1861720ba4f9d3cb6a7f6dfb7ccb33.zip | |
link: ELF, COFF, WASM: honor the "must_link" flag of positionals
Previously only the MachO linker was honoring the flag.
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/Coff.zig | 6 | ||||
| -rw-r--r-- | src/link/Elf.zig | 15 | ||||
| -rw-r--r-- | src/link/Wasm.zig | 15 |
3 files changed, 31 insertions, 5 deletions
diff --git a/src/link/Coff.zig b/src/link/Coff.zig index 152e078b66..894d5dd8f7 100644 --- a/src/link/Coff.zig +++ b/src/link/Coff.zig @@ -1121,7 +1121,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| { diff --git a/src/link/Elf.zig b/src/link/Elf.zig index 8a9d98189a..a5dc43979b 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -1732,9 +1732,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| { diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 7d01ef4083..a5d4630378 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -1437,9 +1437,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| { |
