immunio 0.15.4 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +0 -27
- data/ext/immunio/Rakefile +9 -0
- data/lib/immunio/plugins/active_record.rb +1 -1
- data/lib/immunio/plugins/active_record_relation.rb +1 -1
- data/lib/immunio/plugins/environment_reporter.rb +20 -0
- data/lib/immunio/rufus_lua_ext/ref.rb +1 -3
- data/lib/immunio/version.rb +1 -1
- data/lib/immunio/vm.rb +1 -2
- data/lua-hooks/Makefile +97 -0
- data/lua-hooks/ext/all.c +41 -52
- data/lua-hooks/ext/all.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_html5.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_xss.o +0 -0
- data/lua-hooks/ext/libinjection/lualib.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.o +0 -0
- data/lua-hooks/ext/lpeg/lpcode.c +2 -2
- data/lua-hooks/ext/lpeg/lpcode.h +1 -1
- data/lua-hooks/ext/lpeg/lpcode.o +0 -0
- data/lua-hooks/ext/lpeg/lpprint.o +0 -0
- data/lua-hooks/ext/lpeg/lptree.c +2 -2
- data/lua-hooks/ext/lpeg/lptypes.h +1 -1
- data/lua-hooks/ext/lpeg/lpvm.c +2 -2
- data/lua-hooks/ext/lpeg/lpvm.o +0 -0
- data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +16 -3
- data/lua-hooks/ext/lua-snapshot/snapshot.c +14 -7
- data/lua-hooks/ext/luajit/COPYRIGHT +56 -0
- data/lua-hooks/ext/luajit/Makefile +159 -0
- data/lua-hooks/ext/luajit/README +16 -0
- data/lua-hooks/ext/luajit/doc/bluequad-print.css +166 -0
- data/lua-hooks/ext/luajit/doc/bluequad.css +325 -0
- data/lua-hooks/ext/luajit/doc/changes.html +804 -0
- data/lua-hooks/ext/luajit/doc/contact.html +104 -0
- data/lua-hooks/ext/luajit/doc/ext_c_api.html +189 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi.html +332 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +570 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +1261 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +603 -0
- data/lua-hooks/ext/luajit/doc/ext_jit.html +201 -0
- data/lua-hooks/ext/luajit/doc/ext_profiler.html +365 -0
- data/lua-hooks/ext/luajit/doc/extensions.html +448 -0
- data/lua-hooks/ext/luajit/doc/faq.html +186 -0
- data/lua-hooks/ext/luajit/doc/img/contact.png +0 -0
- data/lua-hooks/ext/luajit/doc/install.html +659 -0
- data/lua-hooks/ext/luajit/doc/luajit.html +236 -0
- data/lua-hooks/ext/luajit/doc/running.html +309 -0
- data/lua-hooks/ext/luajit/doc/status.html +118 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +456 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1125 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +518 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1166 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +416 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +953 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +419 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1919 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +83 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +12 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +471 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +1945 -0
- data/lua-hooks/ext/luajit/dynasm/dynasm.lua +1094 -0
- data/lua-hooks/ext/luajit/etc/luajit.1 +88 -0
- data/lua-hooks/ext/luajit/etc/luajit.pc +25 -0
- data/lua-hooks/ext/luajit/src/Makefile +697 -0
- data/lua-hooks/ext/luajit/src/Makefile.dep +244 -0
- data/lua-hooks/ext/luajit/src/host/README +4 -0
- data/lua-hooks/ext/luajit/src/host/buildvm +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.c +518 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.h +105 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_arch.h +7449 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +345 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +229 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +457 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +45 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +368 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.o +0 -0
- data/lua-hooks/ext/luajit/src/host/genlibbc.lua +197 -0
- data/lua-hooks/ext/luajit/src/host/genminilua.lua +428 -0
- data/lua-hooks/ext/luajit/src/host/minilua +0 -0
- data/lua-hooks/ext/luajit/src/host/minilua.c +7770 -0
- data/lua-hooks/ext/luajit/src/host/minilua.o +0 -0
- data/lua-hooks/ext/luajit/src/jit/bc.lua +190 -0
- data/lua-hooks/ext/luajit/src/jit/bcsave.lua +661 -0
- data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +689 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +428 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +591 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +838 -0
- data/lua-hooks/ext/luajit/src/jit/dump.lua +706 -0
- data/lua-hooks/ext/luajit/src/jit/p.lua +310 -0
- data/lua-hooks/ext/luajit/src/jit/v.lua +170 -0
- data/lua-hooks/ext/luajit/src/jit/vmdef.lua +362 -0
- data/lua-hooks/ext/luajit/src/jit/zone.lua +45 -0
- data/lua-hooks/ext/{lua → luajit/src}/lauxlib.h +10 -17
- data/lua-hooks/ext/luajit/src/lib_aux.c +356 -0
- data/lua-hooks/ext/luajit/src/lib_aux.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_aux_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base.c +664 -0
- data/lua-hooks/ext/luajit/src/lib_base.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit.c +180 -0
- data/lua-hooks/ext/luajit/src/lib_bit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug.c +405 -0
- data/lua-hooks/ext/luajit/src/lib_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.c +872 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init.c +55 -0
- data/lua-hooks/ext/luajit/src/lib_init.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io.c +541 -0
- data/lua-hooks/ext/luajit/src/lib_io.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit.c +767 -0
- data/lua-hooks/ext/luajit/src/lib_jit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math.c +230 -0
- data/lua-hooks/ext/luajit/src/lib_math.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os.c +292 -0
- data/lua-hooks/ext/luajit/src/lib_os.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package.c +610 -0
- data/lua-hooks/ext/luajit/src/lib_package.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string.c +752 -0
- data/lua-hooks/ext/luajit/src/lib_string.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table.c +307 -0
- data/lua-hooks/ext/luajit/src/lib_table.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.a +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.so +0 -0
- data/lua-hooks/ext/luajit/src/lj.supp +26 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.c +1398 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_alloc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api.c +1210 -0
- data/lua-hooks/ext/luajit/src/lj_api.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_arch.h +509 -0
- data/lua-hooks/ext/luajit/src/lj_asm.c +2278 -0
- data/lua-hooks/ext/luajit/src/lj_asm.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_arm.h +2217 -0
- data/lua-hooks/ext/luajit/src/lj_asm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_mips.h +1833 -0
- data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +2015 -0
- data/lua-hooks/ext/luajit/src/lj_asm_x86.h +2634 -0
- data/lua-hooks/ext/luajit/src/lj_bc.c +14 -0
- data/lua-hooks/ext/luajit/src/lj_bc.h +265 -0
- data/lua-hooks/ext/luajit/src/lj_bc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcdef.h +220 -0
- data/lua-hooks/ext/luajit/src/lj_bcdump.h +68 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.c +457 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcread_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.c +361 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf.c +234 -0
- data/lua-hooks/ext/luajit/src/lj_buf.h +105 -0
- data/lua-hooks/ext/luajit/src/lj_buf.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith.c +429 -0
- data/lua-hooks/ext/luajit/src/lj_carith.h +37 -0
- data/lua-hooks/ext/luajit/src/lj_carith.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.c +984 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.h +178 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.c +712 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.h +25 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.c +752 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.h +70 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.c +288 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.h +76 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char.c +43 -0
- data/lua-hooks/ext/luajit/src/lj_char.h +42 -0
- data/lua-hooks/ext/luajit/src/lj_char.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib.c +418 -0
- data/lua-hooks/ext/luajit/src/lj_clib.h +29 -0
- data/lua-hooks/ext/luajit/src/lj_clib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.c +1862 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.c +1834 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.c +635 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.h +461 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug.c +699 -0
- data/lua-hooks/ext/luajit/src/lj_debug.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_def.h +365 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.c +557 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.h +138 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_emit_arm.h +356 -0
- data/lua-hooks/ext/luajit/src/lj_emit_mips.h +211 -0
- data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +238 -0
- data/lua-hooks/ext/luajit/src/lj_emit_x86.h +462 -0
- data/lua-hooks/ext/luajit/src/lj_err.c +794 -0
- data/lua-hooks/ext/luajit/src/lj_err.h +41 -0
- data/lua-hooks/ext/luajit/src/lj_err.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_err_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_errmsg.h +190 -0
- data/lua-hooks/ext/luajit/src/lj_ff.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_ffdef.h +209 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.c +1247 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_folddef.h +1138 -0
- data/lua-hooks/ext/luajit/src/lj_frame.h +259 -0
- data/lua-hooks/ext/luajit/src/lj_func.c +185 -0
- data/lua-hooks/ext/luajit/src/lj_func.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_func.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_func_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc.c +845 -0
- data/lua-hooks/ext/luajit/src/lj_gc.h +134 -0
- data/lua-hooks/ext/luajit/src/lj_gc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.c +787 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.h +22 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir.c +505 -0
- data/lua-hooks/ext/luajit/src/lj_ir.h +577 -0
- data/lua-hooks/ext/luajit/src/lj_ir.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ircall.h +321 -0
- data/lua-hooks/ext/luajit/src/lj_iropt.h +161 -0
- data/lua-hooks/ext/luajit/src/lj_jit.h +440 -0
- data/lua-hooks/ext/luajit/src/lj_lex.c +482 -0
- data/lua-hooks/ext/luajit/src/lj_lex.h +86 -0
- data/lua-hooks/ext/luajit/src/lj_lex.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lex_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib.c +303 -0
- data/lua-hooks/ext/luajit/src/lj_lib.h +115 -0
- data/lua-hooks/ext/luajit/src/lj_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_libdef.h +414 -0
- data/lua-hooks/ext/luajit/src/lj_load.c +168 -0
- data/lua-hooks/ext/luajit/src/lj_load.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_load_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.c +386 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.h +30 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta.c +477 -0
- data/lua-hooks/ext/luajit/src/lj_meta.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_meta.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj.c +50 -0
- data/lua-hooks/ext/luajit/src/lj_obj.h +976 -0
- data/lua-hooks/ext/luajit/src/lj_obj.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.c +78 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.c +2488 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.c +449 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.c +935 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +652 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.c +245 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.c +856 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse.c +2725 -0
- data/lua-hooks/ext/luajit/src/lj_parse.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_parse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile.c +368 -0
- data/lua-hooks/ext/luajit/src/lj_profile.h +21 -0
- data/lua-hooks/ext/luajit/src/lj_profile.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_recdef.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_record.c +2554 -0
- data/lua-hooks/ext/luajit/src/lj_record.h +45 -0
- data/lua-hooks/ext/luajit/src/lj_record.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_record_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap.c +870 -0
- data/lua-hooks/ext/luajit/src/lj_snap.h +34 -0
- data/lua-hooks/ext/luajit/src/lj_snap.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state.c +300 -0
- data/lua-hooks/ext/luajit/src/lj_state.h +35 -0
- data/lua-hooks/ext/luajit/src/lj_state.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str.c +197 -0
- data/lua-hooks/ext/luajit/src/lj_str.h +27 -0
- data/lua-hooks/ext/luajit/src/lj_str.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.c +554 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.h +125 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.c +547 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.h +39 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab.c +666 -0
- data/lua-hooks/ext/luajit/src/lj_tab.h +73 -0
- data/lua-hooks/ext/luajit/src/lj_tab.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_target.h +164 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm64.h +97 -0
- data/lua-hooks/ext/luajit/src/lj_target_mips.h +260 -0
- data/lua-hooks/ext/luajit/src/lj_target_ppc.h +280 -0
- data/lua-hooks/ext/luajit/src/lj_target_x86.h +345 -0
- data/lua-hooks/ext/luajit/src/lj_trace.c +859 -0
- data/lua-hooks/ext/luajit/src/lj_trace.h +54 -0
- data/lua-hooks/ext/luajit/src/lj_trace.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_trace_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_traceerr.h +63 -0
- data/lua-hooks/ext/luajit/src/lj_udata.c +34 -0
- data/lua-hooks/ext/luajit/src/lj_udata.h +14 -0
- data/lua-hooks/ext/luajit/src/lj_udata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_udata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm.S +2730 -0
- data/lua-hooks/ext/luajit/src/lj_vm.h +114 -0
- data/lua-hooks/ext/luajit/src/lj_vm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.c +58 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.h +59 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.c +152 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/ljamalg.c +96 -0
- data/lua-hooks/ext/{lua → luajit/src}/lua.h +12 -7
- data/lua-hooks/ext/luajit/src/lua.hpp +9 -0
- data/lua-hooks/ext/luajit/src/luaconf.h +156 -0
- data/lua-hooks/ext/luajit/src/luajit +0 -0
- data/lua-hooks/ext/luajit/src/luajit.c +570 -0
- data/lua-hooks/ext/luajit/src/luajit.h +79 -0
- data/lua-hooks/ext/luajit/src/luajit.o +0 -0
- data/lua-hooks/ext/luajit/src/lualib.h +43 -0
- data/lua-hooks/ext/luajit/src/msvcbuild.bat +114 -0
- data/lua-hooks/ext/luajit/src/ps4build.bat +103 -0
- data/lua-hooks/ext/luajit/src/psvitabuild.bat +93 -0
- data/lua-hooks/ext/luajit/src/vm_arm.dasc +4585 -0
- data/lua-hooks/ext/luajit/src/vm_arm64.dasc +3764 -0
- data/lua-hooks/ext/luajit/src/vm_mips.dasc +4355 -0
- data/lua-hooks/ext/luajit/src/vm_ppc.dasc +5252 -0
- data/lua-hooks/ext/luajit/src/vm_x64.dasc +4902 -0
- data/lua-hooks/ext/luajit/src/vm_x86.dasc +5710 -0
- data/lua-hooks/ext/luajit/src/xb1build.bat +101 -0
- data/lua-hooks/ext/luajit/src/xedkbuild.bat +92 -0
- data/lua-hooks/ext/luautf8/lutf8lib.c +3 -3
- data/lua-hooks/lib/boot.lua +37 -2
- metadata +372 -69
- data/lua-hooks/ext/bitop/README +0 -22
- data/lua-hooks/ext/bitop/bit.c +0 -189
- data/lua-hooks/ext/extconf.rb +0 -38
- data/lua-hooks/ext/lua/COPYRIGHT +0 -34
- data/lua-hooks/ext/lua/lapi.c +0 -1087
- data/lua-hooks/ext/lua/lapi.h +0 -16
- data/lua-hooks/ext/lua/lauxlib.c +0 -652
- data/lua-hooks/ext/lua/lbaselib.c +0 -659
- data/lua-hooks/ext/lua/lcode.c +0 -831
- data/lua-hooks/ext/lua/lcode.h +0 -76
- data/lua-hooks/ext/lua/ldblib.c +0 -398
- data/lua-hooks/ext/lua/ldebug.c +0 -638
- data/lua-hooks/ext/lua/ldebug.h +0 -33
- data/lua-hooks/ext/lua/ldo.c +0 -519
- data/lua-hooks/ext/lua/ldo.h +0 -57
- data/lua-hooks/ext/lua/ldump.c +0 -164
- data/lua-hooks/ext/lua/lfunc.c +0 -174
- data/lua-hooks/ext/lua/lfunc.h +0 -34
- data/lua-hooks/ext/lua/lgc.c +0 -710
- data/lua-hooks/ext/lua/lgc.h +0 -110
- data/lua-hooks/ext/lua/linit.c +0 -38
- data/lua-hooks/ext/lua/liolib.c +0 -556
- data/lua-hooks/ext/lua/llex.c +0 -463
- data/lua-hooks/ext/lua/llex.h +0 -81
- data/lua-hooks/ext/lua/llimits.h +0 -128
- data/lua-hooks/ext/lua/lmathlib.c +0 -263
- data/lua-hooks/ext/lua/lmem.c +0 -86
- data/lua-hooks/ext/lua/lmem.h +0 -49
- data/lua-hooks/ext/lua/loadlib.c +0 -705
- data/lua-hooks/ext/lua/loadlib_rel.c +0 -760
- data/lua-hooks/ext/lua/lobject.c +0 -214
- data/lua-hooks/ext/lua/lobject.h +0 -381
- data/lua-hooks/ext/lua/lopcodes.c +0 -102
- data/lua-hooks/ext/lua/lopcodes.h +0 -268
- data/lua-hooks/ext/lua/loslib.c +0 -243
- data/lua-hooks/ext/lua/lparser.c +0 -1339
- data/lua-hooks/ext/lua/lparser.h +0 -82
- data/lua-hooks/ext/lua/lstate.c +0 -214
- data/lua-hooks/ext/lua/lstate.h +0 -169
- data/lua-hooks/ext/lua/lstring.c +0 -111
- data/lua-hooks/ext/lua/lstring.h +0 -31
- data/lua-hooks/ext/lua/lstrlib.c +0 -871
- data/lua-hooks/ext/lua/ltable.c +0 -588
- data/lua-hooks/ext/lua/ltable.h +0 -40
- data/lua-hooks/ext/lua/ltablib.c +0 -287
- data/lua-hooks/ext/lua/ltm.c +0 -75
- data/lua-hooks/ext/lua/ltm.h +0 -54
- data/lua-hooks/ext/lua/lua.c +0 -392
- data/lua-hooks/ext/lua/lua.def +0 -131
- data/lua-hooks/ext/lua/lua.rc +0 -28
- data/lua-hooks/ext/lua/lua_dll.rc +0 -26
- data/lua-hooks/ext/lua/luac.c +0 -200
- data/lua-hooks/ext/lua/luac.rc +0 -1
- data/lua-hooks/ext/lua/luaconf.h +0 -763
- data/lua-hooks/ext/lua/luaconf.h.in +0 -724
- data/lua-hooks/ext/lua/luaconf.h.orig +0 -763
- data/lua-hooks/ext/lua/lualib.h +0 -53
- data/lua-hooks/ext/lua/lundump.c +0 -227
- data/lua-hooks/ext/lua/lundump.h +0 -36
- data/lua-hooks/ext/lua/lvm.c +0 -767
- data/lua-hooks/ext/lua/lvm.h +0 -36
- data/lua-hooks/ext/lua/lzio.c +0 -82
- data/lua-hooks/ext/lua/lzio.h +0 -67
- data/lua-hooks/ext/lua/print.c +0 -227
|
Binary file
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
----------------------------------------------------------------------------
|
|
2
|
+
-- LuaJIT bytecode listing module.
|
|
3
|
+
--
|
|
4
|
+
-- Copyright (C) 2005-2015 Mike Pall. All rights reserved.
|
|
5
|
+
-- Released under the MIT license. See Copyright Notice in luajit.h
|
|
6
|
+
----------------------------------------------------------------------------
|
|
7
|
+
--
|
|
8
|
+
-- This module lists the bytecode of a Lua function. If it's loaded by -jbc
|
|
9
|
+
-- it hooks into the parser and lists all functions of a chunk as they
|
|
10
|
+
-- are parsed.
|
|
11
|
+
--
|
|
12
|
+
-- Example usage:
|
|
13
|
+
--
|
|
14
|
+
-- luajit -jbc -e 'local x=0; for i=1,1e6 do x=x+i end; print(x)'
|
|
15
|
+
-- luajit -jbc=- foo.lua
|
|
16
|
+
-- luajit -jbc=foo.list foo.lua
|
|
17
|
+
--
|
|
18
|
+
-- Default output is to stderr. To redirect the output to a file, pass a
|
|
19
|
+
-- filename as an argument (use '-' for stdout) or set the environment
|
|
20
|
+
-- variable LUAJIT_LISTFILE. The file is overwritten every time the module
|
|
21
|
+
-- is started.
|
|
22
|
+
--
|
|
23
|
+
-- This module can also be used programmatically:
|
|
24
|
+
--
|
|
25
|
+
-- local bc = require("jit.bc")
|
|
26
|
+
--
|
|
27
|
+
-- local function foo() print("hello") end
|
|
28
|
+
--
|
|
29
|
+
-- bc.dump(foo) --> -- BYTECODE -- [...]
|
|
30
|
+
-- print(bc.line(foo, 2)) --> 0002 KSTR 1 1 ; "hello"
|
|
31
|
+
--
|
|
32
|
+
-- local out = {
|
|
33
|
+
-- -- Do something with each line:
|
|
34
|
+
-- write = function(t, ...) io.write(...) end,
|
|
35
|
+
-- close = function(t) end,
|
|
36
|
+
-- flush = function(t) end,
|
|
37
|
+
-- }
|
|
38
|
+
-- bc.dump(foo, out)
|
|
39
|
+
--
|
|
40
|
+
------------------------------------------------------------------------------
|
|
41
|
+
|
|
42
|
+
-- Cache some library functions and objects.
|
|
43
|
+
local jit = require("jit")
|
|
44
|
+
assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")
|
|
45
|
+
local jutil = require("jit.util")
|
|
46
|
+
local vmdef = require("jit.vmdef")
|
|
47
|
+
local bit = require("bit")
|
|
48
|
+
local sub, gsub, format = string.sub, string.gsub, string.format
|
|
49
|
+
local byte, band, shr = string.byte, bit.band, bit.rshift
|
|
50
|
+
local funcinfo, funcbc, funck = jutil.funcinfo, jutil.funcbc, jutil.funck
|
|
51
|
+
local funcuvname = jutil.funcuvname
|
|
52
|
+
local bcnames = vmdef.bcnames
|
|
53
|
+
local stdout, stderr = io.stdout, io.stderr
|
|
54
|
+
|
|
55
|
+
------------------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
local function ctlsub(c)
|
|
58
|
+
if c == "\n" then return "\\n"
|
|
59
|
+
elseif c == "\r" then return "\\r"
|
|
60
|
+
elseif c == "\t" then return "\\t"
|
|
61
|
+
else return format("\\%03d", byte(c))
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
-- Return one bytecode line.
|
|
66
|
+
local function bcline(func, pc, prefix)
|
|
67
|
+
local ins, m = funcbc(func, pc)
|
|
68
|
+
if not ins then return end
|
|
69
|
+
local ma, mb, mc = band(m, 7), band(m, 15*8), band(m, 15*128)
|
|
70
|
+
local a = band(shr(ins, 8), 0xff)
|
|
71
|
+
local oidx = 6*band(ins, 0xff)
|
|
72
|
+
local op = sub(bcnames, oidx+1, oidx+6)
|
|
73
|
+
local s = format("%04d %s %-6s %3s ",
|
|
74
|
+
pc, prefix or " ", op, ma == 0 and "" or a)
|
|
75
|
+
local d = shr(ins, 16)
|
|
76
|
+
if mc == 13*128 then -- BCMjump
|
|
77
|
+
return format("%s=> %04d\n", s, pc+d-0x7fff)
|
|
78
|
+
end
|
|
79
|
+
if mb ~= 0 then
|
|
80
|
+
d = band(d, 0xff)
|
|
81
|
+
elseif mc == 0 then
|
|
82
|
+
return s.."\n"
|
|
83
|
+
end
|
|
84
|
+
local kc
|
|
85
|
+
if mc == 10*128 then -- BCMstr
|
|
86
|
+
kc = funck(func, -d-1)
|
|
87
|
+
kc = format(#kc > 40 and '"%.40s"~' or '"%s"', gsub(kc, "%c", ctlsub))
|
|
88
|
+
elseif mc == 9*128 then -- BCMnum
|
|
89
|
+
kc = funck(func, d)
|
|
90
|
+
if op == "TSETM " then kc = kc - 2^52 end
|
|
91
|
+
elseif mc == 12*128 then -- BCMfunc
|
|
92
|
+
local fi = funcinfo(funck(func, -d-1))
|
|
93
|
+
if fi.ffid then
|
|
94
|
+
kc = vmdef.ffnames[fi.ffid]
|
|
95
|
+
else
|
|
96
|
+
kc = fi.loc
|
|
97
|
+
end
|
|
98
|
+
elseif mc == 5*128 then -- BCMuv
|
|
99
|
+
kc = funcuvname(func, d)
|
|
100
|
+
end
|
|
101
|
+
if ma == 5 then -- BCMuv
|
|
102
|
+
local ka = funcuvname(func, a)
|
|
103
|
+
if kc then kc = ka.." ; "..kc else kc = ka end
|
|
104
|
+
end
|
|
105
|
+
if mb ~= 0 then
|
|
106
|
+
local b = shr(ins, 24)
|
|
107
|
+
if kc then return format("%s%3d %3d ; %s\n", s, b, d, kc) end
|
|
108
|
+
return format("%s%3d %3d\n", s, b, d)
|
|
109
|
+
end
|
|
110
|
+
if kc then return format("%s%3d ; %s\n", s, d, kc) end
|
|
111
|
+
if mc == 7*128 and d > 32767 then d = d - 65536 end -- BCMlits
|
|
112
|
+
return format("%s%3d\n", s, d)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
-- Collect branch targets of a function.
|
|
116
|
+
local function bctargets(func)
|
|
117
|
+
local target = {}
|
|
118
|
+
for pc=1,1000000000 do
|
|
119
|
+
local ins, m = funcbc(func, pc)
|
|
120
|
+
if not ins then break end
|
|
121
|
+
if band(m, 15*128) == 13*128 then target[pc+shr(ins, 16)-0x7fff] = true end
|
|
122
|
+
end
|
|
123
|
+
return target
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
-- Dump bytecode instructions of a function.
|
|
127
|
+
local function bcdump(func, out, all)
|
|
128
|
+
if not out then out = stdout end
|
|
129
|
+
local fi = funcinfo(func)
|
|
130
|
+
if all and fi.children then
|
|
131
|
+
for n=-1,-1000000000,-1 do
|
|
132
|
+
local k = funck(func, n)
|
|
133
|
+
if not k then break end
|
|
134
|
+
if type(k) == "proto" then bcdump(k, out, true) end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
out:write(format("-- BYTECODE -- %s-%d\n", fi.loc, fi.lastlinedefined))
|
|
138
|
+
local target = bctargets(func)
|
|
139
|
+
for pc=1,1000000000 do
|
|
140
|
+
local s = bcline(func, pc, target[pc] and "=>")
|
|
141
|
+
if not s then break end
|
|
142
|
+
out:write(s)
|
|
143
|
+
end
|
|
144
|
+
out:write("\n")
|
|
145
|
+
out:flush()
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
------------------------------------------------------------------------------
|
|
149
|
+
|
|
150
|
+
-- Active flag and output file handle.
|
|
151
|
+
local active, out
|
|
152
|
+
|
|
153
|
+
-- List handler.
|
|
154
|
+
local function h_list(func)
|
|
155
|
+
return bcdump(func, out)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
-- Detach list handler.
|
|
159
|
+
local function bclistoff()
|
|
160
|
+
if active then
|
|
161
|
+
active = false
|
|
162
|
+
jit.attach(h_list)
|
|
163
|
+
if out and out ~= stdout and out ~= stderr then out:close() end
|
|
164
|
+
out = nil
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
-- Open the output file and attach list handler.
|
|
169
|
+
local function bcliston(outfile)
|
|
170
|
+
if active then bclistoff() end
|
|
171
|
+
if not outfile then outfile = os.getenv("LUAJIT_LISTFILE") end
|
|
172
|
+
if outfile then
|
|
173
|
+
out = outfile == "-" and stdout or assert(io.open(outfile, "w"))
|
|
174
|
+
else
|
|
175
|
+
out = stderr
|
|
176
|
+
end
|
|
177
|
+
jit.attach(h_list, "bc")
|
|
178
|
+
active = true
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
-- Public module functions.
|
|
182
|
+
return {
|
|
183
|
+
line = bcline,
|
|
184
|
+
dump = bcdump,
|
|
185
|
+
targets = bctargets,
|
|
186
|
+
on = bcliston,
|
|
187
|
+
off = bclistoff,
|
|
188
|
+
start = bcliston -- For -j command line option.
|
|
189
|
+
}
|
|
190
|
+
|
|
@@ -0,0 +1,661 @@
|
|
|
1
|
+
----------------------------------------------------------------------------
|
|
2
|
+
-- LuaJIT module to save/list bytecode.
|
|
3
|
+
--
|
|
4
|
+
-- Copyright (C) 2005-2015 Mike Pall. All rights reserved.
|
|
5
|
+
-- Released under the MIT license. See Copyright Notice in luajit.h
|
|
6
|
+
----------------------------------------------------------------------------
|
|
7
|
+
--
|
|
8
|
+
-- This module saves or lists the bytecode for an input file.
|
|
9
|
+
-- It's run by the -b command line option.
|
|
10
|
+
--
|
|
11
|
+
------------------------------------------------------------------------------
|
|
12
|
+
|
|
13
|
+
local jit = require("jit")
|
|
14
|
+
assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")
|
|
15
|
+
local bit = require("bit")
|
|
16
|
+
|
|
17
|
+
-- Symbol name prefix for LuaJIT bytecode.
|
|
18
|
+
local LJBC_PREFIX = "luaJIT_BC_"
|
|
19
|
+
|
|
20
|
+
------------------------------------------------------------------------------
|
|
21
|
+
|
|
22
|
+
local function usage()
|
|
23
|
+
io.stderr:write[[
|
|
24
|
+
Save LuaJIT bytecode: luajit -b[options] input output
|
|
25
|
+
-l Only list bytecode.
|
|
26
|
+
-s Strip debug info (default).
|
|
27
|
+
-g Keep debug info.
|
|
28
|
+
-n name Set module name (default: auto-detect from input name).
|
|
29
|
+
-t type Set output file type (default: auto-detect from output name).
|
|
30
|
+
-a arch Override architecture for object files (default: native).
|
|
31
|
+
-o os Override OS for object files (default: native).
|
|
32
|
+
-e chunk Use chunk string as input.
|
|
33
|
+
-- Stop handling options.
|
|
34
|
+
- Use stdin as input and/or stdout as output.
|
|
35
|
+
|
|
36
|
+
File types: c h obj o raw (default)
|
|
37
|
+
]]
|
|
38
|
+
os.exit(1)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
local function check(ok, ...)
|
|
42
|
+
if ok then return ok, ... end
|
|
43
|
+
io.stderr:write("luajit: ", ...)
|
|
44
|
+
io.stderr:write("\n")
|
|
45
|
+
os.exit(1)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
local function readfile(input)
|
|
49
|
+
if type(input) == "function" then return input end
|
|
50
|
+
if input == "-" then input = nil end
|
|
51
|
+
return check(loadfile(input))
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
local function savefile(name, mode)
|
|
55
|
+
if name == "-" then return io.stdout end
|
|
56
|
+
return check(io.open(name, mode))
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
------------------------------------------------------------------------------
|
|
60
|
+
|
|
61
|
+
local map_type = {
|
|
62
|
+
raw = "raw", c = "c", h = "h", o = "obj", obj = "obj",
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
local map_arch = {
|
|
66
|
+
x86 = true, x64 = true, arm = true, arm64 = true, ppc = true,
|
|
67
|
+
mips = true, mipsel = true,
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
local map_os = {
|
|
71
|
+
linux = true, windows = true, osx = true, freebsd = true, netbsd = true,
|
|
72
|
+
openbsd = true, dragonfly = true, solaris = true,
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
local function checkarg(str, map, err)
|
|
76
|
+
str = string.lower(str)
|
|
77
|
+
local s = check(map[str], "unknown ", err)
|
|
78
|
+
return s == true and str or s
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
local function detecttype(str)
|
|
82
|
+
local ext = string.match(string.lower(str), "%.(%a+)$")
|
|
83
|
+
return map_type[ext] or "raw"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
local function checkmodname(str)
|
|
87
|
+
check(string.match(str, "^[%w_.%-]+$"), "bad module name")
|
|
88
|
+
return string.gsub(str, "[%.%-]", "_")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
local function detectmodname(str)
|
|
92
|
+
if type(str) == "string" then
|
|
93
|
+
local tail = string.match(str, "[^/\\]+$")
|
|
94
|
+
if tail then str = tail end
|
|
95
|
+
local head = string.match(str, "^(.*)%.[^.]*$")
|
|
96
|
+
if head then str = head end
|
|
97
|
+
str = string.match(str, "^[%w_.%-]+")
|
|
98
|
+
else
|
|
99
|
+
str = nil
|
|
100
|
+
end
|
|
101
|
+
check(str, "cannot derive module name, use -n name")
|
|
102
|
+
return string.gsub(str, "[%.%-]", "_")
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
------------------------------------------------------------------------------
|
|
106
|
+
|
|
107
|
+
local function bcsave_tail(fp, output, s)
|
|
108
|
+
local ok, err = fp:write(s)
|
|
109
|
+
if ok and output ~= "-" then ok, err = fp:close() end
|
|
110
|
+
check(ok, "cannot write ", output, ": ", err)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
local function bcsave_raw(output, s)
|
|
114
|
+
local fp = savefile(output, "wb")
|
|
115
|
+
bcsave_tail(fp, output, s)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
local function bcsave_c(ctx, output, s)
|
|
119
|
+
local fp = savefile(output, "w")
|
|
120
|
+
if ctx.type == "c" then
|
|
121
|
+
fp:write(string.format([[
|
|
122
|
+
#ifdef _cplusplus
|
|
123
|
+
extern "C"
|
|
124
|
+
#endif
|
|
125
|
+
#ifdef _WIN32
|
|
126
|
+
__declspec(dllexport)
|
|
127
|
+
#endif
|
|
128
|
+
const char %s%s[] = {
|
|
129
|
+
]], LJBC_PREFIX, ctx.modname))
|
|
130
|
+
else
|
|
131
|
+
fp:write(string.format([[
|
|
132
|
+
#define %s%s_SIZE %d
|
|
133
|
+
static const char %s%s[] = {
|
|
134
|
+
]], LJBC_PREFIX, ctx.modname, #s, LJBC_PREFIX, ctx.modname))
|
|
135
|
+
end
|
|
136
|
+
local t, n, m = {}, 0, 0
|
|
137
|
+
for i=1,#s do
|
|
138
|
+
local b = tostring(string.byte(s, i))
|
|
139
|
+
m = m + #b + 1
|
|
140
|
+
if m > 78 then
|
|
141
|
+
fp:write(table.concat(t, ",", 1, n), ",\n")
|
|
142
|
+
n, m = 0, #b + 1
|
|
143
|
+
end
|
|
144
|
+
n = n + 1
|
|
145
|
+
t[n] = b
|
|
146
|
+
end
|
|
147
|
+
bcsave_tail(fp, output, table.concat(t, ",", 1, n).."\n};\n")
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
local function bcsave_elfobj(ctx, output, s, ffi)
|
|
151
|
+
ffi.cdef[[
|
|
152
|
+
typedef struct {
|
|
153
|
+
uint8_t emagic[4], eclass, eendian, eversion, eosabi, eabiversion, epad[7];
|
|
154
|
+
uint16_t type, machine;
|
|
155
|
+
uint32_t version;
|
|
156
|
+
uint32_t entry, phofs, shofs;
|
|
157
|
+
uint32_t flags;
|
|
158
|
+
uint16_t ehsize, phentsize, phnum, shentsize, shnum, shstridx;
|
|
159
|
+
} ELF32header;
|
|
160
|
+
typedef struct {
|
|
161
|
+
uint8_t emagic[4], eclass, eendian, eversion, eosabi, eabiversion, epad[7];
|
|
162
|
+
uint16_t type, machine;
|
|
163
|
+
uint32_t version;
|
|
164
|
+
uint64_t entry, phofs, shofs;
|
|
165
|
+
uint32_t flags;
|
|
166
|
+
uint16_t ehsize, phentsize, phnum, shentsize, shnum, shstridx;
|
|
167
|
+
} ELF64header;
|
|
168
|
+
typedef struct {
|
|
169
|
+
uint32_t name, type, flags, addr, ofs, size, link, info, align, entsize;
|
|
170
|
+
} ELF32sectheader;
|
|
171
|
+
typedef struct {
|
|
172
|
+
uint32_t name, type;
|
|
173
|
+
uint64_t flags, addr, ofs, size;
|
|
174
|
+
uint32_t link, info;
|
|
175
|
+
uint64_t align, entsize;
|
|
176
|
+
} ELF64sectheader;
|
|
177
|
+
typedef struct {
|
|
178
|
+
uint32_t name, value, size;
|
|
179
|
+
uint8_t info, other;
|
|
180
|
+
uint16_t sectidx;
|
|
181
|
+
} ELF32symbol;
|
|
182
|
+
typedef struct {
|
|
183
|
+
uint32_t name;
|
|
184
|
+
uint8_t info, other;
|
|
185
|
+
uint16_t sectidx;
|
|
186
|
+
uint64_t value, size;
|
|
187
|
+
} ELF64symbol;
|
|
188
|
+
typedef struct {
|
|
189
|
+
ELF32header hdr;
|
|
190
|
+
ELF32sectheader sect[6];
|
|
191
|
+
ELF32symbol sym[2];
|
|
192
|
+
uint8_t space[4096];
|
|
193
|
+
} ELF32obj;
|
|
194
|
+
typedef struct {
|
|
195
|
+
ELF64header hdr;
|
|
196
|
+
ELF64sectheader sect[6];
|
|
197
|
+
ELF64symbol sym[2];
|
|
198
|
+
uint8_t space[4096];
|
|
199
|
+
} ELF64obj;
|
|
200
|
+
]]
|
|
201
|
+
local symname = LJBC_PREFIX..ctx.modname
|
|
202
|
+
local is64, isbe = false, false
|
|
203
|
+
if ctx.arch == "x64" then
|
|
204
|
+
is64 = true
|
|
205
|
+
elseif ctx.arch == "ppc" or ctx.arch == "mips" then
|
|
206
|
+
isbe = true
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
-- Handle different host/target endianess.
|
|
210
|
+
local function f32(x) return x end
|
|
211
|
+
local f16, fofs = f32, f32
|
|
212
|
+
if ffi.abi("be") ~= isbe then
|
|
213
|
+
f32 = bit.bswap
|
|
214
|
+
function f16(x) return bit.rshift(bit.bswap(x), 16) end
|
|
215
|
+
if is64 then
|
|
216
|
+
local two32 = ffi.cast("int64_t", 2^32)
|
|
217
|
+
function fofs(x) return bit.bswap(x)*two32 end
|
|
218
|
+
else
|
|
219
|
+
fofs = f32
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
-- Create ELF object and fill in header.
|
|
224
|
+
local o = ffi.new(is64 and "ELF64obj" or "ELF32obj")
|
|
225
|
+
local hdr = o.hdr
|
|
226
|
+
if ctx.os == "bsd" or ctx.os == "other" then -- Determine native hdr.eosabi.
|
|
227
|
+
local bf = assert(io.open("/bin/ls", "rb"))
|
|
228
|
+
local bs = bf:read(9)
|
|
229
|
+
bf:close()
|
|
230
|
+
ffi.copy(o, bs, 9)
|
|
231
|
+
check(hdr.emagic[0] == 127, "no support for writing native object files")
|
|
232
|
+
else
|
|
233
|
+
hdr.emagic = "\127ELF"
|
|
234
|
+
hdr.eosabi = ({ freebsd=9, netbsd=2, openbsd=12, solaris=6 })[ctx.os] or 0
|
|
235
|
+
end
|
|
236
|
+
hdr.eclass = is64 and 2 or 1
|
|
237
|
+
hdr.eendian = isbe and 2 or 1
|
|
238
|
+
hdr.eversion = 1
|
|
239
|
+
hdr.type = f16(1)
|
|
240
|
+
hdr.machine = f16(({ x86=3, x64=62, arm=40, arm64=183, ppc=20, mips=8, mipsel=8 })[ctx.arch])
|
|
241
|
+
if ctx.arch == "mips" or ctx.arch == "mipsel" then
|
|
242
|
+
hdr.flags = 0x50001006
|
|
243
|
+
end
|
|
244
|
+
hdr.version = f32(1)
|
|
245
|
+
hdr.shofs = fofs(ffi.offsetof(o, "sect"))
|
|
246
|
+
hdr.ehsize = f16(ffi.sizeof(hdr))
|
|
247
|
+
hdr.shentsize = f16(ffi.sizeof(o.sect[0]))
|
|
248
|
+
hdr.shnum = f16(6)
|
|
249
|
+
hdr.shstridx = f16(2)
|
|
250
|
+
|
|
251
|
+
-- Fill in sections and symbols.
|
|
252
|
+
local sofs, ofs = ffi.offsetof(o, "space"), 1
|
|
253
|
+
for i,name in ipairs{
|
|
254
|
+
".symtab", ".shstrtab", ".strtab", ".rodata", ".note.GNU-stack",
|
|
255
|
+
} do
|
|
256
|
+
local sect = o.sect[i]
|
|
257
|
+
sect.align = fofs(1)
|
|
258
|
+
sect.name = f32(ofs)
|
|
259
|
+
ffi.copy(o.space+ofs, name)
|
|
260
|
+
ofs = ofs + #name+1
|
|
261
|
+
end
|
|
262
|
+
o.sect[1].type = f32(2) -- .symtab
|
|
263
|
+
o.sect[1].link = f32(3)
|
|
264
|
+
o.sect[1].info = f32(1)
|
|
265
|
+
o.sect[1].align = fofs(8)
|
|
266
|
+
o.sect[1].ofs = fofs(ffi.offsetof(o, "sym"))
|
|
267
|
+
o.sect[1].entsize = fofs(ffi.sizeof(o.sym[0]))
|
|
268
|
+
o.sect[1].size = fofs(ffi.sizeof(o.sym))
|
|
269
|
+
o.sym[1].name = f32(1)
|
|
270
|
+
o.sym[1].sectidx = f16(4)
|
|
271
|
+
o.sym[1].size = fofs(#s)
|
|
272
|
+
o.sym[1].info = 17
|
|
273
|
+
o.sect[2].type = f32(3) -- .shstrtab
|
|
274
|
+
o.sect[2].ofs = fofs(sofs)
|
|
275
|
+
o.sect[2].size = fofs(ofs)
|
|
276
|
+
o.sect[3].type = f32(3) -- .strtab
|
|
277
|
+
o.sect[3].ofs = fofs(sofs + ofs)
|
|
278
|
+
o.sect[3].size = fofs(#symname+1)
|
|
279
|
+
ffi.copy(o.space+ofs+1, symname)
|
|
280
|
+
ofs = ofs + #symname + 2
|
|
281
|
+
o.sect[4].type = f32(1) -- .rodata
|
|
282
|
+
o.sect[4].flags = fofs(2)
|
|
283
|
+
o.sect[4].ofs = fofs(sofs + ofs)
|
|
284
|
+
o.sect[4].size = fofs(#s)
|
|
285
|
+
o.sect[5].type = f32(1) -- .note.GNU-stack
|
|
286
|
+
o.sect[5].ofs = fofs(sofs + ofs + #s)
|
|
287
|
+
|
|
288
|
+
-- Write ELF object file.
|
|
289
|
+
local fp = savefile(output, "wb")
|
|
290
|
+
fp:write(ffi.string(o, ffi.sizeof(o)-4096+ofs))
|
|
291
|
+
bcsave_tail(fp, output, s)
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
local function bcsave_peobj(ctx, output, s, ffi)
|
|
295
|
+
ffi.cdef[[
|
|
296
|
+
typedef struct {
|
|
297
|
+
uint16_t arch, nsects;
|
|
298
|
+
uint32_t time, symtabofs, nsyms;
|
|
299
|
+
uint16_t opthdrsz, flags;
|
|
300
|
+
} PEheader;
|
|
301
|
+
typedef struct {
|
|
302
|
+
char name[8];
|
|
303
|
+
uint32_t vsize, vaddr, size, ofs, relocofs, lineofs;
|
|
304
|
+
uint16_t nreloc, nline;
|
|
305
|
+
uint32_t flags;
|
|
306
|
+
} PEsection;
|
|
307
|
+
typedef struct __attribute((packed)) {
|
|
308
|
+
union {
|
|
309
|
+
char name[8];
|
|
310
|
+
uint32_t nameref[2];
|
|
311
|
+
};
|
|
312
|
+
uint32_t value;
|
|
313
|
+
int16_t sect;
|
|
314
|
+
uint16_t type;
|
|
315
|
+
uint8_t scl, naux;
|
|
316
|
+
} PEsym;
|
|
317
|
+
typedef struct __attribute((packed)) {
|
|
318
|
+
uint32_t size;
|
|
319
|
+
uint16_t nreloc, nline;
|
|
320
|
+
uint32_t cksum;
|
|
321
|
+
uint16_t assoc;
|
|
322
|
+
uint8_t comdatsel, unused[3];
|
|
323
|
+
} PEsymaux;
|
|
324
|
+
typedef struct {
|
|
325
|
+
PEheader hdr;
|
|
326
|
+
PEsection sect[2];
|
|
327
|
+
// Must be an even number of symbol structs.
|
|
328
|
+
PEsym sym0;
|
|
329
|
+
PEsymaux sym0aux;
|
|
330
|
+
PEsym sym1;
|
|
331
|
+
PEsymaux sym1aux;
|
|
332
|
+
PEsym sym2;
|
|
333
|
+
PEsym sym3;
|
|
334
|
+
uint32_t strtabsize;
|
|
335
|
+
uint8_t space[4096];
|
|
336
|
+
} PEobj;
|
|
337
|
+
]]
|
|
338
|
+
local symname = LJBC_PREFIX..ctx.modname
|
|
339
|
+
local is64 = false
|
|
340
|
+
if ctx.arch == "x86" then
|
|
341
|
+
symname = "_"..symname
|
|
342
|
+
elseif ctx.arch == "x64" then
|
|
343
|
+
is64 = true
|
|
344
|
+
end
|
|
345
|
+
local symexport = " /EXPORT:"..symname..",DATA "
|
|
346
|
+
|
|
347
|
+
-- The file format is always little-endian. Swap if the host is big-endian.
|
|
348
|
+
local function f32(x) return x end
|
|
349
|
+
local f16 = f32
|
|
350
|
+
if ffi.abi("be") then
|
|
351
|
+
f32 = bit.bswap
|
|
352
|
+
function f16(x) return bit.rshift(bit.bswap(x), 16) end
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
-- Create PE object and fill in header.
|
|
356
|
+
local o = ffi.new("PEobj")
|
|
357
|
+
local hdr = o.hdr
|
|
358
|
+
hdr.arch = f16(({ x86=0x14c, x64=0x8664, arm=0x1c0, ppc=0x1f2, mips=0x366, mipsel=0x366 })[ctx.arch])
|
|
359
|
+
hdr.nsects = f16(2)
|
|
360
|
+
hdr.symtabofs = f32(ffi.offsetof(o, "sym0"))
|
|
361
|
+
hdr.nsyms = f32(6)
|
|
362
|
+
|
|
363
|
+
-- Fill in sections and symbols.
|
|
364
|
+
o.sect[0].name = ".drectve"
|
|
365
|
+
o.sect[0].size = f32(#symexport)
|
|
366
|
+
o.sect[0].flags = f32(0x00100a00)
|
|
367
|
+
o.sym0.sect = f16(1)
|
|
368
|
+
o.sym0.scl = 3
|
|
369
|
+
o.sym0.name = ".drectve"
|
|
370
|
+
o.sym0.naux = 1
|
|
371
|
+
o.sym0aux.size = f32(#symexport)
|
|
372
|
+
o.sect[1].name = ".rdata"
|
|
373
|
+
o.sect[1].size = f32(#s)
|
|
374
|
+
o.sect[1].flags = f32(0x40300040)
|
|
375
|
+
o.sym1.sect = f16(2)
|
|
376
|
+
o.sym1.scl = 3
|
|
377
|
+
o.sym1.name = ".rdata"
|
|
378
|
+
o.sym1.naux = 1
|
|
379
|
+
o.sym1aux.size = f32(#s)
|
|
380
|
+
o.sym2.sect = f16(2)
|
|
381
|
+
o.sym2.scl = 2
|
|
382
|
+
o.sym2.nameref[1] = f32(4)
|
|
383
|
+
o.sym3.sect = f16(-1)
|
|
384
|
+
o.sym3.scl = 2
|
|
385
|
+
o.sym3.value = f32(1)
|
|
386
|
+
o.sym3.name = "@feat.00" -- Mark as SafeSEH compliant.
|
|
387
|
+
ffi.copy(o.space, symname)
|
|
388
|
+
local ofs = #symname + 1
|
|
389
|
+
o.strtabsize = f32(ofs + 4)
|
|
390
|
+
o.sect[0].ofs = f32(ffi.offsetof(o, "space") + ofs)
|
|
391
|
+
ffi.copy(o.space + ofs, symexport)
|
|
392
|
+
ofs = ofs + #symexport
|
|
393
|
+
o.sect[1].ofs = f32(ffi.offsetof(o, "space") + ofs)
|
|
394
|
+
|
|
395
|
+
-- Write PE object file.
|
|
396
|
+
local fp = savefile(output, "wb")
|
|
397
|
+
fp:write(ffi.string(o, ffi.sizeof(o)-4096+ofs))
|
|
398
|
+
bcsave_tail(fp, output, s)
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
local function bcsave_machobj(ctx, output, s, ffi)
|
|
402
|
+
ffi.cdef[[
|
|
403
|
+
typedef struct
|
|
404
|
+
{
|
|
405
|
+
uint32_t magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags;
|
|
406
|
+
} mach_header;
|
|
407
|
+
typedef struct
|
|
408
|
+
{
|
|
409
|
+
mach_header; uint32_t reserved;
|
|
410
|
+
} mach_header_64;
|
|
411
|
+
typedef struct {
|
|
412
|
+
uint32_t cmd, cmdsize;
|
|
413
|
+
char segname[16];
|
|
414
|
+
uint32_t vmaddr, vmsize, fileoff, filesize;
|
|
415
|
+
uint32_t maxprot, initprot, nsects, flags;
|
|
416
|
+
} mach_segment_command;
|
|
417
|
+
typedef struct {
|
|
418
|
+
uint32_t cmd, cmdsize;
|
|
419
|
+
char segname[16];
|
|
420
|
+
uint64_t vmaddr, vmsize, fileoff, filesize;
|
|
421
|
+
uint32_t maxprot, initprot, nsects, flags;
|
|
422
|
+
} mach_segment_command_64;
|
|
423
|
+
typedef struct {
|
|
424
|
+
char sectname[16], segname[16];
|
|
425
|
+
uint32_t addr, size;
|
|
426
|
+
uint32_t offset, align, reloff, nreloc, flags;
|
|
427
|
+
uint32_t reserved1, reserved2;
|
|
428
|
+
} mach_section;
|
|
429
|
+
typedef struct {
|
|
430
|
+
char sectname[16], segname[16];
|
|
431
|
+
uint64_t addr, size;
|
|
432
|
+
uint32_t offset, align, reloff, nreloc, flags;
|
|
433
|
+
uint32_t reserved1, reserved2, reserved3;
|
|
434
|
+
} mach_section_64;
|
|
435
|
+
typedef struct {
|
|
436
|
+
uint32_t cmd, cmdsize, symoff, nsyms, stroff, strsize;
|
|
437
|
+
} mach_symtab_command;
|
|
438
|
+
typedef struct {
|
|
439
|
+
int32_t strx;
|
|
440
|
+
uint8_t type, sect;
|
|
441
|
+
int16_t desc;
|
|
442
|
+
uint32_t value;
|
|
443
|
+
} mach_nlist;
|
|
444
|
+
typedef struct {
|
|
445
|
+
uint32_t strx;
|
|
446
|
+
uint8_t type, sect;
|
|
447
|
+
uint16_t desc;
|
|
448
|
+
uint64_t value;
|
|
449
|
+
} mach_nlist_64;
|
|
450
|
+
typedef struct
|
|
451
|
+
{
|
|
452
|
+
uint32_t magic, nfat_arch;
|
|
453
|
+
} mach_fat_header;
|
|
454
|
+
typedef struct
|
|
455
|
+
{
|
|
456
|
+
uint32_t cputype, cpusubtype, offset, size, align;
|
|
457
|
+
} mach_fat_arch;
|
|
458
|
+
typedef struct {
|
|
459
|
+
struct {
|
|
460
|
+
mach_header hdr;
|
|
461
|
+
mach_segment_command seg;
|
|
462
|
+
mach_section sec;
|
|
463
|
+
mach_symtab_command sym;
|
|
464
|
+
} arch[1];
|
|
465
|
+
mach_nlist sym_entry;
|
|
466
|
+
uint8_t space[4096];
|
|
467
|
+
} mach_obj;
|
|
468
|
+
typedef struct {
|
|
469
|
+
struct {
|
|
470
|
+
mach_header_64 hdr;
|
|
471
|
+
mach_segment_command_64 seg;
|
|
472
|
+
mach_section_64 sec;
|
|
473
|
+
mach_symtab_command sym;
|
|
474
|
+
} arch[1];
|
|
475
|
+
mach_nlist_64 sym_entry;
|
|
476
|
+
uint8_t space[4096];
|
|
477
|
+
} mach_obj_64;
|
|
478
|
+
typedef struct {
|
|
479
|
+
mach_fat_header fat;
|
|
480
|
+
mach_fat_arch fat_arch[2];
|
|
481
|
+
struct {
|
|
482
|
+
mach_header hdr;
|
|
483
|
+
mach_segment_command seg;
|
|
484
|
+
mach_section sec;
|
|
485
|
+
mach_symtab_command sym;
|
|
486
|
+
} arch[2];
|
|
487
|
+
mach_nlist sym_entry;
|
|
488
|
+
uint8_t space[4096];
|
|
489
|
+
} mach_fat_obj;
|
|
490
|
+
]]
|
|
491
|
+
local symname = '_'..LJBC_PREFIX..ctx.modname
|
|
492
|
+
local isfat, is64, align, mobj = false, false, 4, "mach_obj"
|
|
493
|
+
if ctx.arch == "x64" then
|
|
494
|
+
is64, align, mobj = true, 8, "mach_obj_64"
|
|
495
|
+
elseif ctx.arch == "arm" then
|
|
496
|
+
isfat, mobj = true, "mach_fat_obj"
|
|
497
|
+
elseif ctx.arch == "arm64" then
|
|
498
|
+
is64, align, isfat, mobj = true, 8, true, "mach_fat_obj"
|
|
499
|
+
else
|
|
500
|
+
check(ctx.arch == "x86", "unsupported architecture for OSX")
|
|
501
|
+
end
|
|
502
|
+
local function aligned(v, a) return bit.band(v+a-1, -a) end
|
|
503
|
+
local be32 = bit.bswap -- Mach-O FAT is BE, supported archs are LE.
|
|
504
|
+
|
|
505
|
+
-- Create Mach-O object and fill in header.
|
|
506
|
+
local o = ffi.new(mobj)
|
|
507
|
+
local mach_size = aligned(ffi.offsetof(o, "space")+#symname+2, align)
|
|
508
|
+
local cputype = ({ x86={7}, x64={0x01000007}, arm={7,12}, arm64={0x01000007,0x0100000c} })[ctx.arch]
|
|
509
|
+
local cpusubtype = ({ x86={3}, x64={3}, arm={3,9}, arm64={3,0} })[ctx.arch]
|
|
510
|
+
if isfat then
|
|
511
|
+
o.fat.magic = be32(0xcafebabe)
|
|
512
|
+
o.fat.nfat_arch = be32(#cpusubtype)
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
-- Fill in sections and symbols.
|
|
516
|
+
for i=0,#cpusubtype-1 do
|
|
517
|
+
local ofs = 0
|
|
518
|
+
if isfat then
|
|
519
|
+
local a = o.fat_arch[i]
|
|
520
|
+
a.cputype = be32(cputype[i+1])
|
|
521
|
+
a.cpusubtype = be32(cpusubtype[i+1])
|
|
522
|
+
-- Subsequent slices overlap each other to share data.
|
|
523
|
+
ofs = ffi.offsetof(o, "arch") + i*ffi.sizeof(o.arch[0])
|
|
524
|
+
a.offset = be32(ofs)
|
|
525
|
+
a.size = be32(mach_size-ofs+#s)
|
|
526
|
+
end
|
|
527
|
+
local a = o.arch[i]
|
|
528
|
+
a.hdr.magic = is64 and 0xfeedfacf or 0xfeedface
|
|
529
|
+
a.hdr.cputype = cputype[i+1]
|
|
530
|
+
a.hdr.cpusubtype = cpusubtype[i+1]
|
|
531
|
+
a.hdr.filetype = 1
|
|
532
|
+
a.hdr.ncmds = 2
|
|
533
|
+
a.hdr.sizeofcmds = ffi.sizeof(a.seg)+ffi.sizeof(a.sec)+ffi.sizeof(a.sym)
|
|
534
|
+
a.seg.cmd = is64 and 0x19 or 0x1
|
|
535
|
+
a.seg.cmdsize = ffi.sizeof(a.seg)+ffi.sizeof(a.sec)
|
|
536
|
+
a.seg.vmsize = #s
|
|
537
|
+
a.seg.fileoff = mach_size-ofs
|
|
538
|
+
a.seg.filesize = #s
|
|
539
|
+
a.seg.maxprot = 1
|
|
540
|
+
a.seg.initprot = 1
|
|
541
|
+
a.seg.nsects = 1
|
|
542
|
+
ffi.copy(a.sec.sectname, "__data")
|
|
543
|
+
ffi.copy(a.sec.segname, "__DATA")
|
|
544
|
+
a.sec.size = #s
|
|
545
|
+
a.sec.offset = mach_size-ofs
|
|
546
|
+
a.sym.cmd = 2
|
|
547
|
+
a.sym.cmdsize = ffi.sizeof(a.sym)
|
|
548
|
+
a.sym.symoff = ffi.offsetof(o, "sym_entry")-ofs
|
|
549
|
+
a.sym.nsyms = 1
|
|
550
|
+
a.sym.stroff = ffi.offsetof(o, "sym_entry")+ffi.sizeof(o.sym_entry)-ofs
|
|
551
|
+
a.sym.strsize = aligned(#symname+2, align)
|
|
552
|
+
end
|
|
553
|
+
o.sym_entry.type = 0xf
|
|
554
|
+
o.sym_entry.sect = 1
|
|
555
|
+
o.sym_entry.strx = 1
|
|
556
|
+
ffi.copy(o.space+1, symname)
|
|
557
|
+
|
|
558
|
+
-- Write Macho-O object file.
|
|
559
|
+
local fp = savefile(output, "wb")
|
|
560
|
+
fp:write(ffi.string(o, mach_size))
|
|
561
|
+
bcsave_tail(fp, output, s)
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
local function bcsave_obj(ctx, output, s)
|
|
565
|
+
local ok, ffi = pcall(require, "ffi")
|
|
566
|
+
check(ok, "FFI library required to write this file type")
|
|
567
|
+
if ctx.os == "windows" then
|
|
568
|
+
return bcsave_peobj(ctx, output, s, ffi)
|
|
569
|
+
elseif ctx.os == "osx" then
|
|
570
|
+
return bcsave_machobj(ctx, output, s, ffi)
|
|
571
|
+
else
|
|
572
|
+
return bcsave_elfobj(ctx, output, s, ffi)
|
|
573
|
+
end
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
------------------------------------------------------------------------------
|
|
577
|
+
|
|
578
|
+
local function bclist(input, output)
|
|
579
|
+
local f = readfile(input)
|
|
580
|
+
require("jit.bc").dump(f, savefile(output, "w"), true)
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
local function bcsave(ctx, input, output)
|
|
584
|
+
local f = readfile(input)
|
|
585
|
+
local s = string.dump(f, ctx.strip)
|
|
586
|
+
local t = ctx.type
|
|
587
|
+
if not t then
|
|
588
|
+
t = detecttype(output)
|
|
589
|
+
ctx.type = t
|
|
590
|
+
end
|
|
591
|
+
if t == "raw" then
|
|
592
|
+
bcsave_raw(output, s)
|
|
593
|
+
else
|
|
594
|
+
if not ctx.modname then ctx.modname = detectmodname(input) end
|
|
595
|
+
if t == "obj" then
|
|
596
|
+
bcsave_obj(ctx, output, s)
|
|
597
|
+
else
|
|
598
|
+
bcsave_c(ctx, output, s)
|
|
599
|
+
end
|
|
600
|
+
end
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
local function docmd(...)
|
|
604
|
+
local arg = {...}
|
|
605
|
+
local n = 1
|
|
606
|
+
local list = false
|
|
607
|
+
local ctx = {
|
|
608
|
+
strip = true, arch = jit.arch, os = string.lower(jit.os),
|
|
609
|
+
type = false, modname = false,
|
|
610
|
+
}
|
|
611
|
+
while n <= #arg do
|
|
612
|
+
local a = arg[n]
|
|
613
|
+
if type(a) == "string" and string.sub(a, 1, 1) == "-" and a ~= "-" then
|
|
614
|
+
table.remove(arg, n)
|
|
615
|
+
if a == "--" then break end
|
|
616
|
+
for m=2,#a do
|
|
617
|
+
local opt = string.sub(a, m, m)
|
|
618
|
+
if opt == "l" then
|
|
619
|
+
list = true
|
|
620
|
+
elseif opt == "s" then
|
|
621
|
+
ctx.strip = true
|
|
622
|
+
elseif opt == "g" then
|
|
623
|
+
ctx.strip = false
|
|
624
|
+
else
|
|
625
|
+
if arg[n] == nil or m ~= #a then usage() end
|
|
626
|
+
if opt == "e" then
|
|
627
|
+
if n ~= 1 then usage() end
|
|
628
|
+
arg[1] = check(loadstring(arg[1]))
|
|
629
|
+
elseif opt == "n" then
|
|
630
|
+
ctx.modname = checkmodname(table.remove(arg, n))
|
|
631
|
+
elseif opt == "t" then
|
|
632
|
+
ctx.type = checkarg(table.remove(arg, n), map_type, "file type")
|
|
633
|
+
elseif opt == "a" then
|
|
634
|
+
ctx.arch = checkarg(table.remove(arg, n), map_arch, "architecture")
|
|
635
|
+
elseif opt == "o" then
|
|
636
|
+
ctx.os = checkarg(table.remove(arg, n), map_os, "OS name")
|
|
637
|
+
else
|
|
638
|
+
usage()
|
|
639
|
+
end
|
|
640
|
+
end
|
|
641
|
+
end
|
|
642
|
+
else
|
|
643
|
+
n = n + 1
|
|
644
|
+
end
|
|
645
|
+
end
|
|
646
|
+
if list then
|
|
647
|
+
if #arg == 0 or #arg > 2 then usage() end
|
|
648
|
+
bclist(arg[1], arg[2] or "-")
|
|
649
|
+
else
|
|
650
|
+
if #arg ~= 2 then usage() end
|
|
651
|
+
bcsave(ctx, arg[1], arg[2])
|
|
652
|
+
end
|
|
653
|
+
end
|
|
654
|
+
|
|
655
|
+
------------------------------------------------------------------------------
|
|
656
|
+
|
|
657
|
+
-- Public module functions.
|
|
658
|
+
return {
|
|
659
|
+
start = docmd -- Process -b command line option.
|
|
660
|
+
}
|
|
661
|
+
|