mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
Merge pull request #23752 from alexrp/static-native-glibc
compiler: Allow linking native glibc statically
This commit is contained in:
commit
dffd18f133
3 changed files with 20 additions and 7 deletions
|
|
@ -129,6 +129,7 @@ pub const ResolveError = error{
|
||||||
LldCannotIncrementallyLink,
|
LldCannotIncrementallyLink,
|
||||||
LtoRequiresLld,
|
LtoRequiresLld,
|
||||||
SanitizeThreadRequiresLibCpp,
|
SanitizeThreadRequiresLibCpp,
|
||||||
|
LibCRequiresLibUnwind,
|
||||||
LibCppRequiresLibUnwind,
|
LibCppRequiresLibUnwind,
|
||||||
OsRequiresLibC,
|
OsRequiresLibC,
|
||||||
LibCppRequiresLibC,
|
LibCppRequiresLibC,
|
||||||
|
|
@ -312,8 +313,8 @@ pub fn resolve(options: Options) ResolveError!Config {
|
||||||
break :b false;
|
break :b false;
|
||||||
};
|
};
|
||||||
|
|
||||||
const link_libunwind = b: {
|
var link_libunwind = b: {
|
||||||
if (link_libcpp and target_util.libcNeedsLibUnwind(target)) {
|
if (link_libcpp and target_util.libCxxNeedsLibUnwind(target)) {
|
||||||
if (options.link_libunwind == false) return error.LibCppRequiresLibUnwind;
|
if (options.link_libunwind == false) return error.LibCppRequiresLibUnwind;
|
||||||
break :b true;
|
break :b true;
|
||||||
}
|
}
|
||||||
|
|
@ -352,7 +353,7 @@ pub fn resolve(options: Options) ResolveError!Config {
|
||||||
break :b .static;
|
break :b .static;
|
||||||
}
|
}
|
||||||
if (explicitly_exe_or_dyn_lib and link_libc and
|
if (explicitly_exe_or_dyn_lib and link_libc and
|
||||||
(target.isGnuLibC() or target_util.osRequiresLibC(target)))
|
(target_util.osRequiresLibC(target) or (target.isGnuLibC() and !options.resolved_target.is_native_abi)))
|
||||||
{
|
{
|
||||||
if (options.link_mode == .static) return error.LibCRequiresDynamicLinking;
|
if (options.link_mode == .static) return error.LibCRequiresDynamicLinking;
|
||||||
break :b .dynamic;
|
break :b .dynamic;
|
||||||
|
|
@ -367,11 +368,11 @@ pub fn resolve(options: Options) ResolveError!Config {
|
||||||
|
|
||||||
if (options.link_mode) |link_mode| break :b link_mode;
|
if (options.link_mode) |link_mode| break :b link_mode;
|
||||||
|
|
||||||
if (explicitly_exe_or_dyn_lib and link_libc and
|
if (explicitly_exe_or_dyn_lib and link_libc and options.resolved_target.is_native_abi and
|
||||||
options.resolved_target.is_native_abi and target.abi.isMusl())
|
(target.isGnuLibC() or target.isMuslLibC()))
|
||||||
{
|
{
|
||||||
// If targeting the system's native ABI and the system's libc is
|
// If targeting the system's native ABI and the system's libc is
|
||||||
// musl, link dynamically by default.
|
// glibc or musl, link dynamically by default.
|
||||||
break :b .dynamic;
|
break :b .dynamic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -379,6 +380,13 @@ pub fn resolve(options: Options) ResolveError!Config {
|
||||||
break :b .static;
|
break :b .static;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// This is done here to avoid excessive duplicated logic due to the complex dependencies between these options.
|
||||||
|
if (options.output_mode == .Exe and link_libc and target_util.libCNeedsLibUnwind(target, link_mode)) {
|
||||||
|
if (options.link_libunwind == false) return error.LibCRequiresLibUnwind;
|
||||||
|
|
||||||
|
link_libunwind = true;
|
||||||
|
}
|
||||||
|
|
||||||
const import_memory = options.import_memory orelse (options.output_mode == .Obj);
|
const import_memory = options.import_memory orelse (options.output_mode == .Obj);
|
||||||
const export_memory = b: {
|
const export_memory = b: {
|
||||||
if (link_mode == .dynamic) {
|
if (link_mode == .dynamic) {
|
||||||
|
|
|
||||||
|
|
@ -4206,6 +4206,7 @@ fn createModule(
|
||||||
error.LldCannotIncrementallyLink => fatal("self-hosted backends do not support linking with LLD", .{}),
|
error.LldCannotIncrementallyLink => fatal("self-hosted backends do not support linking with LLD", .{}),
|
||||||
error.LtoRequiresLld => fatal("LTO requires using LLD", .{}),
|
error.LtoRequiresLld => fatal("LTO requires using LLD", .{}),
|
||||||
error.SanitizeThreadRequiresLibCpp => fatal("thread sanitization is (for now) implemented in C++, so it requires linking libc++", .{}),
|
error.SanitizeThreadRequiresLibCpp => fatal("thread sanitization is (for now) implemented in C++, so it requires linking libc++", .{}),
|
||||||
|
error.LibCRequiresLibUnwind => fatal("libc of the specified target requires linking libunwind", .{}),
|
||||||
error.LibCppRequiresLibUnwind => fatal("libc++ requires linking libunwind", .{}),
|
error.LibCppRequiresLibUnwind => fatal("libc++ requires linking libunwind", .{}),
|
||||||
error.OsRequiresLibC => fatal("the target OS requires using libc as the stable syscall interface", .{}),
|
error.OsRequiresLibC => fatal("the target OS requires using libc as the stable syscall interface", .{}),
|
||||||
error.LibCppRequiresLibC => fatal("libc++ requires linking libc", .{}),
|
error.LibCppRequiresLibC => fatal("libc++ requires linking libc", .{}),
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,11 @@ pub fn osRequiresLibC(target: std.Target) bool {
|
||||||
return target.os.requiresLibC();
|
return target.os.requiresLibC();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn libcNeedsLibUnwind(target: std.Target) bool {
|
pub fn libCNeedsLibUnwind(target: std.Target, link_mode: std.builtin.LinkMode) bool {
|
||||||
|
return target.isGnuLibC() and link_mode == .static;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn libCxxNeedsLibUnwind(target: std.Target) bool {
|
||||||
return switch (target.os.tag) {
|
return switch (target.os.tag) {
|
||||||
.macos,
|
.macos,
|
||||||
.ios,
|
.ios,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue