diff options
| author | Vincent Rischmann <vincent@rischmann.fr> | 2021-06-15 00:51:28 +0200 |
|---|---|---|
| committer | Michael Dusan <michael.dusan@gmail.com> | 2021-06-17 17:32:17 -0400 |
| commit | 6f0cfdb8206026f239ca079a9f3eebae20bd5310 (patch) | |
| tree | cfae70fc577ac22c8e4d6558a1defa726a130acf /src/main.zig | |
| parent | e18ef71d989701833dc94d518e559817a781a7bf (diff) | |
| download | zig-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.zig | 42 |
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}); } |
