diff --git a/lib/std/zig/cross_target.zig b/lib/std/zig/cross_target.zig index 3d39c8338b..77c7f12728 100644 --- a/lib/std/zig/cross_target.zig +++ b/lib/std/zig/cross_target.zig @@ -608,10 +608,15 @@ pub const CrossTarget = struct { // If the OS and CPU arch match, the binary can be considered native. if (os_match and cpu_arch == Target.current.cpu.arch) { // However, we also need to verify that the dynamic linker path is valid. - // TODO Until that is implemented, we prevent returning `.native` when the OS is non-native. if (self.os_tag == null) { return .native; } + if (self.dynamic_linker.max_byte) |len| blk: { + std.fs.cwd().access(self.dynamic_linker.buffer[0..len + 1], .{}) catch { + break :blk; + }; + return .native; + } } // If the OS matches, we can use QEMU to emulate a foreign architecture. diff --git a/test/stage2/test.zig b/test/stage2/test.zig index 183555e331..2090c9493e 100644 --- a/test/stage2/test.zig +++ b/test/stage2/test.zig @@ -14,6 +14,7 @@ const linux_x64 = std.zig.CrossTarget{ const macosx_x64 = std.zig.CrossTarget{ .cpu_arch = .x86_64, .os_tag = .macos, + .dynamic_linker = std.zig.CrossTarget.DynamicLinker.init("/usr/lib/dyld"), }; const linux_riscv64 = std.zig.CrossTarget{ @@ -145,7 +146,7 @@ pub fn addCases(ctx: *TestContext) !void { } { - var case = ctx.exe("hello world", macosx_x64); + var case = ctx.exe("hello world with updates", macosx_x64); case.addError("", &[_][]const u8{":1:1: error: no entry point found"}); // Incorrect return type