aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-01-28 12:18:53 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-01-28 12:18:53 -0700
commitd7deffee8d1861720ba4f9d3cb6a7f6dfb7ccb33 (patch)
tree729feabb46efe36be83da943a8e624b48634cda7 /src
parent0e6d2184cacf2dd1fad7508b2f9ae99d78763148 (diff)
downloadzig-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.zig6
-rw-r--r--src/link/Elf.zig15
-rw-r--r--src/link/Wasm.zig15
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| {