diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/jit/bcsave.lua | 30 |
1 files 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 { | |||
| 465 | mach_segment_command_64 seg; | 465 | mach_segment_command_64 seg; |
| 466 | mach_section_64 sec; | 466 | mach_section_64 sec; |
| 467 | mach_symtab_command sym; | 467 | mach_symtab_command sym; |
| 468 | } mach_obj_64; | ||
| 469 | typedef struct { | ||
| 468 | mach_nlist_64 sym_entry; | 470 | mach_nlist_64 sym_entry; |
| 469 | uint8_t space[4096]; | 471 | uint8_t space[4096]; |
| 470 | } mach_obj_64; | 472 | } mach_obj_64_tail; |
| 471 | ]] | 473 | ]] |
| 472 | local symname = '_'..LJBC_PREFIX..ctx.modname | 474 | local symname = '_'..LJBC_PREFIX..ctx.modname |
| 473 | local cputype, cpusubtype = 0x01000007, 3 | 475 | local cputype, cpusubtype = 0x01000007, 3 |
| @@ -479,7 +481,10 @@ typedef struct { | |||
| 479 | 481 | ||
| 480 | -- Create Mach-O object and fill in header. | 482 | -- Create Mach-O object and fill in header. |
| 481 | local o = ffi.new("mach_obj_64") | 483 | local o = ffi.new("mach_obj_64") |
| 482 | local mach_size = aligned(ffi.offsetof(o, "space")+#symname+2, 8) | 484 | local t = ffi.new("mach_obj_64_tail") |
| 485 | local ofs_bc = ffi.sizeof(o) | ||
| 486 | local sz_bc = aligned(#s, 8) | ||
| 487 | local ofs_sym = ofs_bc + sz_bc | ||
| 483 | 488 | ||
| 484 | -- Fill in sections and symbols. | 489 | -- Fill in sections and symbols. |
| 485 | o.hdr.magic = 0xfeedfacf | 490 | o.hdr.magic = 0xfeedfacf |
| @@ -491,7 +496,7 @@ typedef struct { | |||
| 491 | o.seg.cmd = 0x19 | 496 | o.seg.cmd = 0x19 |
| 492 | o.seg.cmdsize = ffi.sizeof(o.seg)+ffi.sizeof(o.sec) | 497 | o.seg.cmdsize = ffi.sizeof(o.seg)+ffi.sizeof(o.sec) |
| 493 | o.seg.vmsize = #s | 498 | o.seg.vmsize = #s |
| 494 | o.seg.fileoff = mach_size | 499 | o.seg.fileoff = ofs_bc |
| 495 | o.seg.filesize = #s | 500 | o.seg.filesize = #s |
| 496 | o.seg.maxprot = 1 | 501 | o.seg.maxprot = 1 |
| 497 | o.seg.initprot = 1 | 502 | o.seg.initprot = 1 |
| @@ -499,22 +504,23 @@ typedef struct { | |||
| 499 | ffi.copy(o.sec.sectname, "__data") | 504 | ffi.copy(o.sec.sectname, "__data") |
| 500 | ffi.copy(o.sec.segname, "__DATA") | 505 | ffi.copy(o.sec.segname, "__DATA") |
| 501 | o.sec.size = #s | 506 | o.sec.size = #s |
| 502 | o.sec.offset = mach_size | 507 | o.sec.offset = ofs_bc |
| 503 | o.sym.cmd = 2 | 508 | o.sym.cmd = 2 |
| 504 | o.sym.cmdsize = ffi.sizeof(o.sym) | 509 | o.sym.cmdsize = ffi.sizeof(o.sym) |
| 505 | o.sym.symoff = ffi.offsetof(o, "sym_entry") | 510 | o.sym.symoff = ofs_sym |
| 506 | o.sym.nsyms = 1 | 511 | o.sym.nsyms = 1 |
| 507 | o.sym.stroff = ffi.offsetof(o, "sym_entry")+ffi.sizeof(o.sym_entry) | 512 | o.sym.stroff = ofs_sym + ffi.offsetof(t, "space") |
| 508 | o.sym.strsize = aligned(#symname+2, 8) | 513 | o.sym.strsize = aligned(#symname+2, 8) |
| 509 | o.sym_entry.type = 0xf | 514 | t.sym_entry.type = 0xf |
| 510 | o.sym_entry.sect = 1 | 515 | t.sym_entry.sect = 1 |
| 511 | o.sym_entry.strx = 1 | 516 | t.sym_entry.strx = 1 |
| 512 | ffi.copy(o.space+1, symname) | 517 | ffi.copy(t.space+1, symname) |
| 513 | 518 | ||
| 514 | -- Write Mach-O object file. | 519 | -- Write Mach-O object file. |
| 515 | local fp = savefile(output, "wb") | 520 | local fp = savefile(output, "wb") |
| 516 | fp:write(ffi.string(o, mach_size)) | 521 | fp:write(ffi.string(o, ofs_bc)) |
| 517 | bcsave_tail(fp, output, s) | 522 | fp:write(s, ("\0"):rep(sz_bc - #s)) |
| 523 | bcsave_tail(fp, output, ffi.string(t, ffi.offsetof(t, "space") + o.sym.strsize)) | ||
| 518 | end | 524 | end |
| 519 | 525 | ||
| 520 | local function bcsave_obj(ctx, output, s) | 526 | local function bcsave_obj(ctx, output, s) |
