From 5ac91794cce8bd53916a378815be01e4365d53d9 Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Mon, 10 May 2021 21:29:20 +0200 Subject: stage2: use system libc when targeting the native OS/ABI Currently zig will always try to build its own libc and compile against that. This of course makes sense for cross-compilation, but can cause problems when targeting the native OS/ABI. For example, if the system uses a newer glibc version than zig ships zig will fall back to using the newest version it does ship. However this causes linking system libraries to fail as they are built against a different glibc version than the zig code is built against. To remedy this, simply default to linking the system libc when targeting the native OS/ABI. --- src/Compilation.zig | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/Compilation.zig b/src/Compilation.zig index 87d4c4c41e..71df776855 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -848,7 +848,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation { arena, options.zig_lib_directory.path.?, options.target, - options.is_native_os, + options.is_native_abi, link_libc, options.libc_installation, ); @@ -2885,7 +2885,7 @@ fn detectLibCIncludeDirs( arena: *Allocator, zig_lib_dir: []const u8, target: Target, - is_native_os: bool, + is_native_abi: bool, link_libc: bool, libc_installation: ?*const LibCInstallation, ) !LibCDirs { @@ -2900,6 +2900,12 @@ fn detectLibCIncludeDirs( return detectLibCFromLibCInstallation(arena, target, lci); } + if (is_native_abi) { + const libc = try arena.create(LibCInstallation); + libc.* = try LibCInstallation.findNative(.{ .allocator = arena }); + return detectLibCFromLibCInstallation(arena, target, libc); + } + if (target_util.canBuildLibC(target)) { const generic_name = target_util.libCGenericName(target); // Some architectures are handled by the same set of headers. @@ -2950,12 +2956,6 @@ fn detectLibCIncludeDirs( }; } - if (is_native_os) { - const libc = try arena.create(LibCInstallation); - libc.* = try LibCInstallation.findNative(.{ .allocator = arena }); - return detectLibCFromLibCInstallation(arena, target, libc); - } - return LibCDirs{ .libc_include_dir_list = &[0][]u8{}, .libc_installation = null, -- cgit v1.2.3 From 01e30002c52eda1ab3574f55c2e0568c56f2ed09 Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Mon, 10 May 2021 23:12:17 +0200 Subject: stage2: error if requested glibc version too high Falling back to the max provided glibc version is insufficient as linking to shared objects compiled against the requested version will fail. --- src/glibc.zig | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/glibc.zig b/src/glibc.zig index 7600f19503..6b288ac46d 100644 --- a/src/glibc.zig +++ b/src/glibc.zig @@ -764,16 +764,17 @@ pub fn buildSharedObjects(comp: *Compilation) !void { .lt => continue, .gt => { // TODO Expose via compile error mechanism instead of log. - std.log.warn("invalid target glibc version: {}", .{target_version}); + std.log.err("invalid target glibc version: {}", .{target_version}); return error.InvalidTargetGLibCVersion; }, } - } else blk: { + } else { const latest_index = metadata.all_versions.len - 1; - std.log.warn("zig cannot build new glibc version {}; providing instead {}", .{ + // TODO Expose via compile error mechanism instead of log. + std.log.err("zig does not yet provide glibc version {}, the max provided version is {}", .{ target_version, metadata.all_versions[latest_index], }); - break :blk latest_index; + return error.InvalidTargetGLibCVersion; }; { var map_contents = std.ArrayList(u8).init(arena); -- cgit v1.2.3 From 3b2c9ef828cc97a4c4664324d93ddbe3696b17fb Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Tue, 11 May 2021 15:27:43 +0200 Subject: stage2: link all libc components if using system libc --- src/link/Elf.zig | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/link/Elf.zig b/src/link/Elf.zig index c31a094093..91ee6f3206 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -1650,9 +1650,15 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void { if (self.base.options.libc_installation != null) { const needs_grouping = self.base.options.link_mode == .Static; if (needs_grouping) try argv.append("--start-group"); - try argv.append("-lm"); - try argv.append("-lpthread"); - try argv.append("-lc"); + // This matches the order of glibc.libs + try argv.appendSlice(&[_][]const u8{ + "-lm", + "-lpthread", + "-lc", + "-ldl", + "-lrt", + "-lutil", + }); if (needs_grouping) try argv.append("--end-group"); } else if (target.isGnuLibC()) { try argv.append(comp.libunwind_static_lib.?.full_object_path); -- cgit v1.2.3