macOS: Change Mach-O object file layout required by XCode 15.0.
Reported by George Zhao. #1404
This commit is contained in:
@@ -465,9 +465,11 @@ typedef struct {
|
|||||||
mach_segment_command_64 seg;
|
mach_segment_command_64 seg;
|
||||||
mach_section_64 sec;
|
mach_section_64 sec;
|
||||||
mach_symtab_command sym;
|
mach_symtab_command sym;
|
||||||
|
} mach_obj_64;
|
||||||
|
typedef struct {
|
||||||
mach_nlist_64 sym_entry;
|
mach_nlist_64 sym_entry;
|
||||||
uint8_t space[4096];
|
uint8_t space[4096];
|
||||||
} mach_obj_64;
|
} mach_obj_64_tail;
|
||||||
]]
|
]]
|
||||||
local symname = '_'..LJBC_PREFIX..ctx.modname
|
local symname = '_'..LJBC_PREFIX..ctx.modname
|
||||||
local cputype, cpusubtype = 0x01000007, 3
|
local cputype, cpusubtype = 0x01000007, 3
|
||||||
@@ -479,7 +481,10 @@ typedef struct {
|
|||||||
|
|
||||||
-- Create Mach-O object and fill in header.
|
-- Create Mach-O object and fill in header.
|
||||||
local o = ffi.new("mach_obj_64")
|
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.
|
-- Fill in sections and symbols.
|
||||||
o.hdr.magic = 0xfeedfacf
|
o.hdr.magic = 0xfeedfacf
|
||||||
@@ -491,7 +496,7 @@ typedef struct {
|
|||||||
o.seg.cmd = 0x19
|
o.seg.cmd = 0x19
|
||||||
o.seg.cmdsize = ffi.sizeof(o.seg)+ffi.sizeof(o.sec)
|
o.seg.cmdsize = ffi.sizeof(o.seg)+ffi.sizeof(o.sec)
|
||||||
o.seg.vmsize = #s
|
o.seg.vmsize = #s
|
||||||
o.seg.fileoff = mach_size
|
o.seg.fileoff = ofs_bc
|
||||||
o.seg.filesize = #s
|
o.seg.filesize = #s
|
||||||
o.seg.maxprot = 1
|
o.seg.maxprot = 1
|
||||||
o.seg.initprot = 1
|
o.seg.initprot = 1
|
||||||
@@ -499,22 +504,23 @@ typedef struct {
|
|||||||
ffi.copy(o.sec.sectname, "__data")
|
ffi.copy(o.sec.sectname, "__data")
|
||||||
ffi.copy(o.sec.segname, "__DATA")
|
ffi.copy(o.sec.segname, "__DATA")
|
||||||
o.sec.size = #s
|
o.sec.size = #s
|
||||||
o.sec.offset = mach_size
|
o.sec.offset = ofs_bc
|
||||||
o.sym.cmd = 2
|
o.sym.cmd = 2
|
||||||
o.sym.cmdsize = ffi.sizeof(o.sym)
|
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.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.strsize = aligned(#symname+2, 8)
|
||||||
o.sym_entry.type = 0xf
|
t.sym_entry.type = 0xf
|
||||||
o.sym_entry.sect = 1
|
t.sym_entry.sect = 1
|
||||||
o.sym_entry.strx = 1
|
t.sym_entry.strx = 1
|
||||||
ffi.copy(o.space+1, symname)
|
ffi.copy(t.space+1, symname)
|
||||||
|
|
||||||
-- Write Mach-O object file.
|
-- Write Mach-O object file.
|
||||||
local fp = savefile(output, "wb")
|
local fp = savefile(output, "wb")
|
||||||
fp:write(ffi.string(o, mach_size))
|
fp:write(ffi.string(o, ofs_bc))
|
||||||
bcsave_tail(fp, output, s)
|
fp:write(s, ("\0"):rep(sz_bc - #s))
|
||||||
|
bcsave_tail(fp, output, ffi.string(t, ffi.offsetof(t, "space") + o.sym.strsize))
|
||||||
end
|
end
|
||||||
|
|
||||||
local function bcsave_obj(ctx, output, s)
|
local function bcsave_obj(ctx, output, s)
|
||||||
|
|||||||
Reference in New Issue
Block a user