Skip to content

Commit 1f2f1c8

Browse files
committed
src/glibc: Do some arch-specific glibc version checks
Some architectures are only supported, by glibc, at more recent versions. So add some checks for these systems. Issue #17769
1 parent decea4c commit 1f2f1c8

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

Diff for: src/glibc.zig

+42
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,8 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: *std.Progress.Node) !vo
746746
return error.InvalidTargetGLibCVersion;
747747
}
748748

749+
try isArchSupportedGlibcVersion(target, target_version);
750+
749751
{
750752
var map_contents = std.ArrayList(u8).init(arena);
751753
for (metadata.all_versions[0 .. target_ver_index + 1]) |ver| {
@@ -1142,3 +1144,43 @@ pub fn needsCrtiCrtn(target: std.Target) bool {
11421144
pub fn isSupportedGlibcVersion(ver: Version) bool {
11431145
return (ver.major > 2) or ((ver.major == 2) and (ver.minor >= 17));
11441146
}
1147+
1148+
// Check if given glibc version is supported by target's architecture. Note that
1149+
// target.zig's `available_libcs` should filter out many architectures before this.
1150+
pub fn isArchSupportedGlibcVersion(target: std.Target, ver: Version) !void {
1151+
// See https://github.com/ziglang/zig/issues/17769
1152+
switch (target.cpu.arch) {
1153+
.powerpc64le => {
1154+
if ((ver.major < 2) or ((ver.major == 2) and (ver.minor < 19))) {
1155+
log.warn("{s} only supported on glibc v2.19+", .{@tagName(target.cpu.arch)});
1156+
return error.InvalidTargetGLibCVersion;
1157+
}
1158+
},
1159+
.riscv64 => {
1160+
if ((ver.major < 2) or ((ver.major == 2) and (ver.minor < 27))) {
1161+
log.warn("{s} only supported on glibc v2.27+", .{@tagName(target.cpu.arch)});
1162+
return error.InvalidTargetGLibCVersion;
1163+
}
1164+
},
1165+
1166+
// For many architectures, glibc support is older than the Zig
1167+
// minimum (v2.17), so we don't need to check specifics.
1168+
.aarch64,
1169+
.aarch64_be,
1170+
.arm,
1171+
.m68k,
1172+
.powerpc64,
1173+
.powerpc,
1174+
.sparc,
1175+
.sparc64,
1176+
.x86,
1177+
.x86_64,
1178+
=> return,
1179+
1180+
// Other platforms are ... unknown?
1181+
else => {
1182+
log.warn("{s} has undefined glibc support. Please file a bug.", .{@tagName(target.cpu.arch)});
1183+
return error.InvalidTargetGLibCVersion;
1184+
},
1185+
}
1186+
}

Diff for: src/target.zig

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub const ArchOsAbi = struct {
1111
};
1212

1313
pub const available_libcs = [_]ArchOsAbi{
14-
.{ .arch = .aarch64_be, .os = .linux, .abi = .gnu },
14+
.{ .arch = .aarch64_be, .os = .linux, .abi = .gnu }, // glibc aarch64 v2.17+
1515
.{ .arch = .aarch64_be, .os = .linux, .abi = .musl },
1616
.{ .arch = .aarch64_be, .os = .windows, .abi = .gnu },
1717
.{ .arch = .aarch64, .os = .linux, .abi = .gnu },
@@ -51,14 +51,14 @@ pub const available_libcs = [_]ArchOsAbi{
5151
.{ .arch = .mips, .os = .linux, .abi = .gnueabi },
5252
.{ .arch = .mips, .os = .linux, .abi = .gnueabihf },
5353
.{ .arch = .mips, .os = .linux, .abi = .musl },
54-
.{ .arch = .powerpc64le, .os = .linux, .abi = .gnu },
54+
.{ .arch = .powerpc64le, .os = .linux, .abi = .gnu }, // glibc powerpc64le v2.19+
5555
.{ .arch = .powerpc64le, .os = .linux, .abi = .musl },
5656
.{ .arch = .powerpc64, .os = .linux, .abi = .gnu },
5757
.{ .arch = .powerpc64, .os = .linux, .abi = .musl },
5858
.{ .arch = .powerpc, .os = .linux, .abi = .gnueabi },
5959
.{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf },
6060
.{ .arch = .powerpc, .os = .linux, .abi = .musl },
61-
.{ .arch = .riscv64, .os = .linux, .abi = .gnu },
61+
.{ .arch = .riscv64, .os = .linux, .abi = .gnu }, // glibc riscv v2.27+
6262
.{ .arch = .riscv64, .os = .linux, .abi = .musl },
6363
.{ .arch = .s390x, .os = .linux, .abi = .gnu },
6464
.{ .arch = .s390x, .os = .linux, .abi = .musl },

0 commit comments

Comments
 (0)