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"),
flagpd1("dylinker"),
flagpd1("dynamic"),
.{
.name = "dynamic",
.syntax = .flag,
.zig_equivalent = .dynamic,
.pd1 = true,
.pd2 = false,
.psl = false,
},
.{
.name = "dynamiclib",
.syntax = .flag,
@ -5698,7 +5705,7 @@ flagpd1("startfiles"),
.{
.name = "static",
.syntax = .flag,
.zig_equivalent = .other,
.zig_equivalent = .static,
.pd1 = true,
.pd2 = true,
.psl = false,

View file

@ -2338,6 +2338,16 @@ fn buildOutputType(
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.
@ -5954,6 +5964,8 @@ pub const ClangArgIterator = struct {
san_cov,
no_san_cov,
rtlib,
static,
dynamic,
};
const Args = struct {

View file

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