aboutsummaryrefslogtreecommitdiff
path: root/src/link/Coff.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-01-24 14:30:05 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-01-24 14:30:28 -0700
commit0cfa39304b18c6a04689bd789f5dc4d035ec43b0 (patch)
tree9dc20b8bbf29909fc7f093618cccd42845aa4e41 /src/link/Coff.zig
parentb56e916fa1d3508a01a6fc0b62f3f64dd3843b85 (diff)
downloadzig-0cfa39304b18c6a04689bd789f5dc4d035ec43b0.tar.gz
zig-0cfa39304b18c6a04689bd789f5dc4d035ec43b0.zip
zig cc: recognize more coff linker options
Related: #7874
Diffstat (limited to 'src/link/Coff.zig')
-rw-r--r--src/link/Coff.zig57
1 files changed, 49 insertions, 8 deletions
diff --git a/src/link/Coff.zig b/src/link/Coff.zig
index 1acf09a1dc..0dfa3d54a1 100644
--- a/src/link/Coff.zig
+++ b/src/link/Coff.zig
@@ -877,6 +877,11 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void {
man.hash.addStringSet(self.base.options.system_libs);
man.hash.addOptional(self.base.options.subsystem);
man.hash.add(self.base.options.is_test);
+ man.hash.add(self.base.options.tsaware);
+ man.hash.add(self.base.options.nxcompat);
+ man.hash.add(self.base.options.dynamicbase);
+ man.hash.addOptional(self.base.options.major_subsystem_version);
+ man.hash.addOptional(self.base.options.minor_subsystem_version);
// We don't actually care whether it's a cache hit or miss; we just need the digest and the lock.
_ = try man.hit();
@@ -976,6 +981,26 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void {
try argv.append("-DLL");
}
+ if (self.base.options.tsaware) {
+ try argv.append("-tsaware");
+ }
+ if (self.base.options.nxcompat) {
+ try argv.append("-nxcompat");
+ }
+ if (self.base.options.dynamicbase) {
+ try argv.append("-dynamicbase");
+ }
+ const subsystem_suffix = ss: {
+ if (self.base.options.major_subsystem_version) |major| {
+ if (self.base.options.minor_subsystem_version) |minor| {
+ break :ss try allocPrint(arena, ",{d}.{d}", .{ major, minor });
+ } else {
+ break :ss try allocPrint(arena, ",{d}", .{major});
+ }
+ }
+ break :ss "";
+ };
+
try argv.append(try allocPrint(arena, "-OUT:{s}", .{full_out_path}));
if (self.base.options.link_libc) {
@@ -1029,35 +1054,51 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void {
const mode: Mode = mode: {
if (resolved_subsystem) |subsystem| switch (subsystem) {
.Console => {
- try argv.append("-SUBSYSTEM:console");
+ try argv.append(try allocPrint(arena, "-SUBSYSTEM:console{s}", .{
+ subsystem_suffix,
+ }));
break :mode .win32;
},
.EfiApplication => {
- try argv.append("-SUBSYSTEM:efi_application");
+ try argv.append(try allocPrint(arena, "-SUBSYSTEM:efi_application{s}", .{
+ subsystem_suffix,
+ }));
break :mode .uefi;
},
.EfiBootServiceDriver => {
- try argv.append("-SUBSYSTEM:efi_boot_service_driver");
+ try argv.append(try allocPrint(arena, "-SUBSYSTEM:efi_boot_service_driver{s}", .{
+ subsystem_suffix,
+ }));
break :mode .uefi;
},
.EfiRom => {
- try argv.append("-SUBSYSTEM:efi_rom");
+ try argv.append(try allocPrint(arena, "-SUBSYSTEM:efi_rom{s}", .{
+ subsystem_suffix,
+ }));
break :mode .uefi;
},
.EfiRuntimeDriver => {
- try argv.append("-SUBSYSTEM:efi_runtime_driver");
+ try argv.append(try allocPrint(arena, "-SUBSYSTEM:efi_runtime_driver{s}", .{
+ subsystem_suffix,
+ }));
break :mode .uefi;
},
.Native => {
- try argv.append("-SUBSYSTEM:native");
+ try argv.append(try allocPrint(arena, "-SUBSYSTEM:native{s}", .{
+ subsystem_suffix,
+ }));
break :mode .win32;
},
.Posix => {
- try argv.append("-SUBSYSTEM:posix");
+ try argv.append(try allocPrint(arena, "-SUBSYSTEM:posix{s}", .{
+ subsystem_suffix,
+ }));
break :mode .win32;
},
.Windows => {
- try argv.append("-SUBSYSTEM:windows");
+ try argv.append(try allocPrint(arena, "-SUBSYSTEM:windows{s}", .{
+ subsystem_suffix,
+ }));
break :mode .win32;
},
} else if (target.os.tag == .uefi) {