aboutsummaryrefslogtreecommitdiff
path: root/src/jit
diff options
context:
space:
mode:
Diffstat (limited to 'src/jit')
-rw-r--r--src/jit/bcsave.lua30
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;
469typedef 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))
518end 524end
519 525
520local function bcsave_obj(ctx, output, s) 526local function bcsave_obj(ctx, output, s)