Skip to content

Commit 1a171a1

Browse files
authored
Merge pull request #6842 from kubkon/aarch64-macos-fix
std: Apple Silicon: no fstat$INODE64 symbol found
2 parents e1ca694 + 4f50958 commit 1a171a1

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

lib/std/c.zig

+2-2
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ pub extern "c" fn readlinkat(dirfd: fd_t, noalias path: [*:0]const u8, noalias b
124124
pub usingnamespace switch (builtin.os.tag) {
125125
.macos, .ios, .watchos, .tvos => struct {
126126
pub const realpath = @"realpath$DARWIN_EXTSN";
127-
pub const fstatat = @"fstatat$INODE64";
127+
pub const fstatat = _fstatat;
128128
},
129129
else => struct {
130130
pub extern "c" fn realpath(noalias file_name: [*:0]const u8, noalias resolved_name: [*]u8) ?[*:0]u8;
@@ -194,7 +194,7 @@ pub usingnamespace switch (builtin.os.tag) {
194194
// XXX: getdirentries -> _getdirentries64
195195
pub extern "c" fn clock_getres(clk_id: c_int, tp: *timespec) c_int;
196196
pub extern "c" fn clock_gettime(clk_id: c_int, tp: *timespec) c_int;
197-
pub const fstat = @"fstat$INODE64";
197+
pub const fstat = _fstat;
198198
pub extern "c" fn getrusage(who: c_int, usage: *rusage) c_int;
199199
pub extern "c" fn gettimeofday(noalias tv: ?*timeval, noalias tz: ?*timezone) c_int;
200200
pub extern "c" fn nanosleep(rqtp: *const timespec, rmtp: ?*timespec) c_int;

lib/std/c/darwin.zig

+12-2
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,18 @@ pub extern "c" fn fcopyfile(from: fd_t, to: fd_t, state: ?copyfile_state_t, flag
2929
pub extern "c" fn @"realpath$DARWIN_EXTSN"(noalias file_name: [*:0]const u8, noalias resolved_name: [*]u8) ?[*:0]u8;
3030

3131
pub extern "c" fn __getdirentries64(fd: c_int, buf_ptr: [*]u8, buf_len: usize, basep: *i64) isize;
32-
pub extern "c" fn @"fstat$INODE64"(fd: fd_t, buf: *Stat) c_int;
33-
pub extern "c" fn @"fstatat$INODE64"(dirfd: fd_t, path_name: [*:0]const u8, buf: *Stat, flags: u32) c_int;
32+
33+
extern "c" fn fstat(fd: fd_t, buf: *Stat) c_int;
34+
/// On x86_64 Darwin, fstat has to be manully linked with $INODE64 suffix to force 64bit version.
35+
/// Note that this is fixed on aarch64 and no longer necessary.
36+
extern "c" fn @"fstat$INODE64"(fd: fd_t, buf: *Stat) c_int;
37+
pub const _fstat = if (builtin.arch == .aarch64) fstat else @"fstat$INODE64";
38+
39+
extern "c" fn fstatat(dirfd: fd_t, path: [*:0]const u8, stat_buf: *Stat, flags: u32) c_int;
40+
/// On x86_64 Darwin, fstatat has to be manully linked with $INODE64 suffix to force 64bit version.
41+
/// Note that this is fixed on aarch64 and no longer necessary.
42+
extern "c" fn @"fstatat$INODE64"(dirfd: fd_t, path_name: [*:0]const u8, buf: *Stat, flags: u32) c_int;
43+
pub const _fstatat = if (builtin.arch == .aarch64) fstatat else @"fstatat$INODE64";
3444

3545
pub extern "c" fn mach_absolute_time() u64;
3646
pub extern "c" fn mach_timebase_info(tinfo: ?*mach_timebase_info_data) void;

0 commit comments

Comments
 (0)