aboutsummaryrefslogtreecommitdiff
path: root/src/main.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/main.zig
parentb56e916fa1d3508a01a6fc0b62f3f64dd3843b85 (diff)
downloadzig-0cfa39304b18c6a04689bd789f5dc4d035ec43b0.tar.gz
zig-0cfa39304b18c6a04689bd789f5dc4d035ec43b0.zip
zig cc: recognize more coff linker options
Related: #7874
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/main.zig b/src/main.zig
index 32c35739cd..26e222016a 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -529,6 +529,9 @@ fn buildOutputType(
var linker_bind_global_refs_locally: ?bool = null;
var linker_z_nodelete = false;
var linker_z_defs = false;
+ var linker_tsaware = false;
+ var linker_nxcompat = false;
+ var linker_dynamicbase = false;
var test_evented_io = false;
var stack_size_override: ?u64 = null;
var image_base_override: ?u64 = null;
@@ -549,6 +552,8 @@ fn buildOutputType(
var main_pkg_path: ?[]const u8 = null;
var clang_preprocessor_mode: Compilation.ClangPreprocessorMode = .no;
var subsystem: ?std.Target.SubSystem = null;
+ var major_subsystem_version: ?u32 = null;
+ var minor_subsystem_version: ?u32 = null;
var system_libs = std.ArrayList([]const u8).init(gpa);
defer system_libs.deinit();
@@ -1307,10 +1312,56 @@ fn buildOutputType(
image_base_override = std.fmt.parseUnsigned(u64, linker_args.items[i], 0) catch |err| {
fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
};
+ } else if (mem.eql(u8, arg, "-T")) {
+ i += 1;
+ if (i >= linker_args.items.len) {
+ fatal("expected linker arg after '{s}'", .{arg});
+ }
+ linker_script = linker_args.items[i];
} else if (mem.eql(u8, arg, "--eh-frame-hdr")) {
link_eh_frame_hdr = true;
} else if (mem.eql(u8, arg, "--no-eh-frame-hdr")) {
link_eh_frame_hdr = false;
+ } else if (mem.eql(u8, arg, "--tsaware")) {
+ linker_tsaware = true;
+ } else if (mem.eql(u8, arg, "--nxcompat")) {
+ linker_nxcompat = true;
+ } else if (mem.eql(u8, arg, "--dynamicbase")) {
+ linker_dynamicbase = true;
+ } else if (mem.eql(u8, arg, "--high-entropy-va")) {
+ // This option does not do anything.
+ } else if (mem.eql(u8, arg, "--export-all-symbols")) {
+ rdynamic = true;
+ } else if (mem.eql(u8, arg, "--start-group") or
+ mem.eql(u8, arg, "--end-group"))
+ {
+ // We don't need to care about these because these args are
+ // for resolving circular dependencies but our linker takes
+ // care of this without explicit args.
+ } else if (mem.startsWith(u8, arg, "--major-os-version") or
+ mem.startsWith(u8, arg, "--minor-os-version"))
+ {
+ // This option does not do anything.
+ } else if (mem.startsWith(u8, arg, "--major-subsystem-version=")) {
+ major_subsystem_version = std.fmt.parseUnsigned(
+ u32,
+ arg["--major-subsystem-version=".len..],
+ 10,
+ ) catch |err| {
+ fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
+ };
+ } else if (mem.startsWith(u8, arg, "--minor-subsystem-version=")) {
+ minor_subsystem_version = std.fmt.parseUnsigned(
+ u32,
+ arg["--minor-subsystem-version=".len..],
+ 10,
+ ) catch |err| {
+ fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
+ };
+ } else if (mem.startsWith(u8, arg, "--major-os-version=") or
+ mem.startsWith(u8, arg, "--minor-os-version="))
+ {
+ // These args do nothing.
} else {
warn("unsupported linker arg: {s}", .{arg});
}
@@ -1800,6 +1851,11 @@ fn buildOutputType(
.linker_bind_global_refs_locally = linker_bind_global_refs_locally,
.linker_z_nodelete = linker_z_nodelete,
.linker_z_defs = linker_z_defs,
+ .linker_tsaware = linker_tsaware,
+ .linker_nxcompat = linker_nxcompat,
+ .linker_dynamicbase = linker_dynamicbase,
+ .major_subsystem_version = major_subsystem_version,
+ .minor_subsystem_version = minor_subsystem_version,
.link_eh_frame_hdr = link_eh_frame_hdr,
.link_emit_relocs = link_emit_relocs,
.stack_size_override = stack_size_override,