zig cc: Respect Clang's -static and -dynamic flags.

Before:

    ❯ zig cc main.c -target x86_64-linux-musl && musl-ldd ./a.out
    musl-ldd: ./a.out: Not a valid dynamic program
    ❯ zig cc main.c -target x86_64-linux-musl -static && musl-ldd ./a.out
    musl-ldd: ./a.out: Not a valid dynamic program
    ❯ zig cc main.c -target x86_64-linux-musl -dynamic && musl-ldd ./a.out
    musl-ldd: ./a.out: Not a valid dynamic program

After:

    ❯ zig cc main.c -target x86_64-linux-musl && musl-ldd ./a.out
    musl-ldd: ./a.out: Not a valid dynamic program
    ❯ zig cc main.c -target x86_64-linux-musl -static && musl-ldd ./a.out
    musl-ldd: ./a.out: Not a valid dynamic program
    ❯ zig cc main.c -target x86_64-linux-musl -dynamic && musl-ldd ./a.out
            /lib/ld-musl-x86_64.so.1 (0x72c10019e000)
            libc.so => /lib/ld-musl-x86_64.so.1 (0x72c10019e000)

Closes #11909.
This commit is contained in:
Alex Rønne Petersen 2025-04-14 21:01:25 +02:00
parent 715984340b
commit 6a8228603c
No known key found for this signature in database
3 changed files with 29 additions and 2 deletions

View file

@ -2610,7 +2610,14 @@ flagpd1("dwarf-ext-refs"),
}, },
sepd1("dylib_file"), sepd1("dylib_file"),
flagpd1("dylinker"), flagpd1("dylinker"),
flagpd1("dynamic"), .{
.name = "dynamic",
.syntax = .flag,
.zig_equivalent = .dynamic,
.pd1 = true,
.pd2 = false,
.psl = false,
},
.{ .{
.name = "dynamiclib", .name = "dynamiclib",
.syntax = .flag, .syntax = .flag,
@ -5698,7 +5705,7 @@ flagpd1("startfiles"),
.{ .{
.name = "static", .name = "static",
.syntax = .flag, .syntax = .flag,
.zig_equivalent = .other, .zig_equivalent = .static,
.pd1 = true, .pd1 = true,
.pd2 = true, .pd2 = true,
.psl = false, .psl = false,

View file

@ -2338,6 +2338,16 @@ fn buildOutputType(
fatal("unsupported -rtlib option '{s}'", .{it.only_arg}); fatal("unsupported -rtlib option '{s}'", .{it.only_arg});
} }
}, },
.static => {
create_module.opts.link_mode = .static;
lib_preferred_mode = .static;
lib_search_strategy = .no_fallback;
},
.dynamic => {
create_module.opts.link_mode = .dynamic;
lib_preferred_mode = .dynamic;
lib_search_strategy = .mode_first;
},
} }
} }
// Parse linker args. // Parse linker args.
@ -5954,6 +5964,8 @@ pub const ClangArgIterator = struct {
san_cov, san_cov,
no_san_cov, no_san_cov,
rtlib, rtlib,
static,
dynamic,
}; };
const Args = struct { const Args = struct {

View file

@ -572,6 +572,14 @@ const known_options = [_]KnownOpt{
.name = "rtlib=", .name = "rtlib=",
.ident = "rtlib", .ident = "rtlib",
}, },
.{
.name = "static",
.ident = "static",
},
.{
.name = "dynamic",
.ident = "dynamic",
},
}; };
const blacklisted_options = [_][]const u8{}; const blacklisted_options = [_][]const u8{};