aboutsummaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorVincent Rischmann <vincent@rischmann.fr>2021-06-15 00:51:28 +0200
committerMichael Dusan <michael.dusan@gmail.com>2021-06-17 17:32:17 -0400
commit6f0cfdb8206026f239ca079a9f3eebae20bd5310 (patch)
treecfae70fc577ac22c8e4d6558a1defa726a130acf /src/main.zig
parente18ef71d989701833dc94d518e559817a781a7bf (diff)
downloadzig-6f0cfdb8206026f239ca079a9f3eebae20bd5310.tar.gz
zig-6f0cfdb8206026f239ca079a9f3eebae20bd5310.zip
zig cc: improve linker args parsing
Handle linker args joined with a = like -Wl,-rpath=foo Update existing args --major-os-version, --minor-os-version, --major-subsystem-version and --minor-subsytem-version to work with the new parsing. Also handle -Wl,--script in addition to -Wl,-T
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig42
1 files changed, 31 insertions, 11 deletions
diff --git a/src/main.zig b/src/main.zig
index ed90f7472d..c592653e24 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -1179,6 +1179,16 @@ fn buildOutputType(
.wl => {
var split_it = mem.split(it.only_arg, ",");
while (split_it.next()) |linker_arg| {
+ // Handle nested-joined args like `-Wl,-rpath=foo`.
+ // Must be prefixed with 1 or 2 dashes.
+ if (linker_arg.len >= 3 and linker_arg[0] == '-' and linker_arg[2] != '-') {
+ if (mem.indexOfScalar(u8, linker_arg, '=')) |equals_pos| {
+ try linker_args.append(linker_arg[0..equals_pos]);
+ try linker_args.append(linker_arg[equals_pos + 1 ..]);
+ continue;
+ }
+ }
+
try linker_args.append(linker_arg);
}
},
@@ -1394,7 +1404,7 @@ 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")) {
+ } else if (mem.eql(u8, arg, "-T") or mem.eql(u8, arg, "--script")) {
i += 1;
if (i >= linker_args.items.len) {
fatal("expected linker arg after '{s}'", .{arg});
@@ -1420,30 +1430,40 @@ fn buildOutputType(
// 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"))
+ } else if (mem.eql(u8, arg, "--major-os-version") or
+ mem.eql(u8, arg, "--minor-os-version"))
{
+ i += 1;
+ if (i >= linker_args.items.len) {
+ fatal("expected linker arg after '{s}'", .{arg});
+ }
// This option does not do anything.
- } else if (mem.startsWith(u8, arg, "--major-subsystem-version=")) {
+ } else if (mem.eql(u8, arg, "--major-subsystem-version")) {
+ i += 1;
+ if (i >= linker_args.items.len) {
+ fatal("expected linker arg after '{s}'", .{arg});
+ }
+
major_subsystem_version = std.fmt.parseUnsigned(
u32,
- arg["--major-subsystem-version=".len..],
+ linker_args.items[i],
10,
) catch |err| {
fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
};
- } else if (mem.startsWith(u8, arg, "--minor-subsystem-version=")) {
+ } else if (mem.eql(u8, arg, "--minor-subsystem-version")) {
+ i += 1;
+ if (i >= linker_args.items.len) {
+ fatal("expected linker arg after '{s}'", .{arg});
+ }
+
minor_subsystem_version = std.fmt.parseUnsigned(
u32,
- arg["--minor-subsystem-version=".len..],
+ linker_args.items[i],
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});
}