From fdf2379ccba1eb68ff07f8bc48541568f5bbdfbf Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 8 Nov 2025 16:54:00 +0100 Subject: [PATCH] macOS: Change Mach-O object file layout required by XCode 15.0. Reported by George Zhao. #1404 --- src/jit/bcsave.lua | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/jit/bcsave.lua b/src/jit/bcsave.lua index a30a34b6..e4ca1977 100644 --- a/src/jit/bcsave.lua +++ b/src/jit/bcsave.lua @@ -465,9 +465,11 @@ typedef struct { mach_segment_command_64 seg; mach_section_64 sec; mach_symtab_command sym; +} mach_obj_64; +typedef struct { mach_nlist_64 sym_entry; uint8_t space[4096]; -} mach_obj_64; +} mach_obj_64_tail; ]] local symname = '_'..LJBC_PREFIX..ctx.modname local cputype, cpusubtype = 0x01000007, 3 @@ -479,7 +481,10 @@ typedef struct { -- Create Mach-O object and fill in header. local o = ffi.new("mach_obj_64") - local mach_size = aligned(ffi.offsetof(o, "space")+#symname+2, 8) + local t = ffi.new("mach_obj_64_tail") + local ofs_bc = ffi.sizeof(o) + local sz_bc = aligned(#s, 8) + local ofs_sym = ofs_bc + sz_bc -- Fill in sections and symbols. o.hdr.magic = 0xfeedfacf @@ -491,7 +496,7 @@ typedef struct { o.seg.cmd = 0x19 o.seg.cmdsize = ffi.sizeof(o.seg)+ffi.sizeof(o.sec) o.seg.vmsize = #s - o.seg.fileoff = mach_size + o.seg.fileoff = ofs_bc o.seg.filesize = #s o.seg.maxprot = 1 o.seg.initprot = 1 @@ -499,22 +504,23 @@ typedef struct { ffi.copy(o.sec.sectname, "__data") ffi.copy(o.sec.segname, "__DATA") o.sec.size = #s - o.sec.offset = mach_size + o.sec.offset = ofs_bc o.sym.cmd = 2 o.sym.cmdsize = ffi.sizeof(o.sym) - o.sym.symoff = ffi.offsetof(o, "sym_entry") + o.sym.symoff = ofs_sym o.sym.nsyms = 1 - o.sym.stroff = ffi.offsetof(o, "sym_entry")+ffi.sizeof(o.sym_entry) + o.sym.stroff = ofs_sym + ffi.offsetof(t, "space") o.sym.strsize = aligned(#symname+2, 8) - o.sym_entry.type = 0xf - o.sym_entry.sect = 1 - o.sym_entry.strx = 1 - ffi.copy(o.space+1, symname) + t.sym_entry.type = 0xf + t.sym_entry.sect = 1 + t.sym_entry.strx = 1 + ffi.copy(t.space+1, symname) -- Write Mach-O object file. local fp = savefile(output, "wb") - fp:write(ffi.string(o, mach_size)) - bcsave_tail(fp, output, s) + fp:write(ffi.string(o, ofs_bc)) + fp:write(s, ("\0"):rep(sz_bc - #s)) + bcsave_tail(fp, output, ffi.string(t, ffi.offsetof(t, "space") + o.sym.strsize)) end local function bcsave_obj(ctx, output, s) -- 2.47.3