authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-12-07 09:11:01+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-12-07 09:18:35+01:00
log2f20ee373bbb2527272ed04af46ba68963f8b7ea
tree3943eb511a223ef556abb68d63281516d66330ed
parent6906460d56df977cd7fdc03e9c8a8daabf1d1307
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

libc: deal with freebsd 15 changes (new libsys, libutil sover)


2 files changed, 37 insertions(+), 10 deletions(-)

src/libs/freebsd.zig+32-9
......@@ -257,6 +257,12 @@ pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progre
257257pub const Lib = struct {
258258 name: []const u8,
259259 sover: u8,
260 added_in: ?Version = null,
261
262 pub fn getSoVersion(lib: Lib, os: *const std.Target.Os) u8 {
263 if (std.mem.eql(u8, lib.name, "util") and os.version_range.semver.min.major >= 15) return 10;
264 return lib.sover;
265 }
260266};
261267
262268pub const libs = [_]Lib{
......@@ -269,6 +275,7 @@ pub const libs = [_]Lib{
269275 .{ .name = "ld", .sover = 1 },
270276 .{ .name = "util", .sover = 9 },
271277 .{ .name = "execinfo", .sover = 1 },
278 .{ .name = "sys", .sover = 7, .added_in = .{ .major = 15, .minor = 0, .patch = 0 } },
272279};
273280
274281pub const ABI = struct {
......@@ -434,7 +441,8 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) anye
434441
435442 const target = comp.getTarget();
436443 // FreeBSD 7 == FBSD_1.0, ..., FreeBSD 14 == FBSD_1.7
437 const target_version: Version = .{ .major = 1, .minor = target.os.version_range.semver.min.major - 7, .patch = 0 };
444 const target_os_version: Version = target.os.version_range.semver.min;
445 const target_libc_version: Version = .{ .major = 1, .minor = target_os_version.major - 7, .patch = 0 };
438446
439447 // Use the global cache directory.
440448 var cache: Cache = .{
......@@ -452,7 +460,7 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) anye
452460 man.hash.addBytes(build_options.version);
453461 man.hash.add(target.cpu.arch);
454462 man.hash.add(target.abi);
455 man.hash.add(target_version);
463 man.hash.add(target_os_version);
456464
457465 const full_abilists_path = try comp.dirs.zig_lib.join(arena, &.{abilists_path});
458466 const abilists_index = try man.addFile(full_abilists_path, abilists_max_size);
......@@ -494,19 +502,19 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) anye
494502 };
495503
496504 const target_ver_index = for (metadata.all_versions, 0..) |ver, i| {
497 switch (ver.order(target_version)) {
505 switch (ver.order(target_libc_version)) {
498506 .eq => break i,
499507 .lt => continue,
500508 .gt => {
501509 // TODO Expose via compile error mechanism instead of log.
502 log.warn("invalid target FreeBSD libc version: {f}", .{target_version});
510 log.warn("invalid target FreeBSD libc version: {f}", .{target_libc_version});
503511 return error.InvalidTargetLibCVersion;
504512 },
505513 }
506514 } else blk: {
507515 const latest_index = metadata.all_versions.len - 1;
508516 log.warn("zig cannot build new FreeBSD libc version {f}; providing instead {f}", .{
509 target_version, metadata.all_versions[latest_index],
517 target_libc_version, metadata.all_versions[latest_index],
510518 });
511519 break :blk latest_index;
512520 };
......@@ -524,6 +532,11 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) anye
524532 defer stubs_asm.deinit();
525533
526534 for (libs, 0..) |lib, lib_i| {
535 if (lib.added_in) |add_in| {
536 // Note: Compare OS version, not libc version.
537 if (target.os.version_range.semver.min.order(add_in) == .lt) continue;
538 }
539
527540 stubs_asm.shrinkRetainingCapacity(0);
528541
529542 try stubs_asm.appendSlice(".text\n");
......@@ -983,6 +996,9 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) anye
983996}
984997
985998fn queueSharedObjects(comp: *Compilation, so_files: BuiltSharedObjects) void {
999 const target = comp.getTarget();
1000 const target_os_version = target.os.version_range.semver.min;
1001
9861002 assert(comp.freebsd_so_files == null);
9871003 comp.freebsd_so_files = so_files;
9881004
......@@ -994,10 +1010,14 @@ fn queueSharedObjects(comp: *Compilation, so_files: BuiltSharedObjects) void {
9941010 defer comp.mutex.unlock();
9951011
9961012 for (libs) |lib| {
1013 if (lib.added_in) |add_in| {
1014 if (target_os_version.order(add_in) == .lt) continue;
1015 }
1016
9971017 const so_path: Path = .{
9981018 .root_dir = so_files.dir_path.root_dir,
9991019 .sub_path = std.fmt.allocPrint(comp.arena, "{s}{c}lib{s}.so.{d}", .{
1000 so_files.dir_path.sub_path, fs.path.sep, lib.name, lib.sover,
1020 so_files.dir_path.sub_path, fs.path.sep, lib.name, lib.getSoVersion(&target.os),
10011021 }) catch return comp.setAllocFailure(),
10021022 };
10031023 task_buffer[task_buffer_i] = .{ .load_dso = so_path };
......@@ -1019,10 +1039,13 @@ fn buildSharedLib(
10191039 const tracy = trace(@src());
10201040 defer tracy.end();
10211041
1042 const target = comp.getTarget();
1043
10221044 const io = comp.io;
1023 const basename = try std.fmt.allocPrint(arena, "lib{s}.so.{d}", .{ lib.name, lib.sover });
1024 const version: Version = .{ .major = lib.sover, .minor = 0, .patch = 0 };
1025 const ld_basename = path.basename(comp.getTarget().standardDynamicLinkerPath().get().?);
1045 const sover = lib.getSoVersion(&target.os);
1046 const basename = try std.fmt.allocPrint(arena, "lib{s}.so.{d}", .{ lib.name, sover });
1047 const version: Version = .{ .major = sover, .minor = 0, .patch = 0 };
1048 const ld_basename = path.basename(target.standardDynamicLinkerPath().get().?);
10261049 const soname = if (mem.eql(u8, lib.name, "ld")) ld_basename else basename;
10271050 const map_file_path = try path.join(arena, &.{ bin_directory.path.?, all_map_basename });
10281051
src/link/Lld.zig+5-1
......@@ -1190,8 +1190,12 @@ fn elfLink(lld: *Lld, arena: Allocator) !void {
11901190 }));
11911191 } else if (target.isFreeBSDLibC()) {
11921192 for (freebsd.libs) |lib| {
1193 if (lib.added_in) |add_in| {
1194 if (target.os.version_range.semver.min.order(add_in) == .lt) continue;
1195 }
1196
11931197 const lib_path = try std.fmt.allocPrint(arena, "{f}{c}lib{s}.so.{d}", .{
1194 comp.freebsd_so_files.?.dir_path, fs.path.sep, lib.name, lib.sover,
1198 comp.freebsd_so_files.?.dir_path, fs.path.sep, lib.name, lib.getSoVersion(&target.os),
11951199 });
11961200 try argv.append(lib_path);
11971201 }