參考資訊:
https://savannah.gnu.org/git/?group=libjit
main.c
#include <stdio.h> #include <jit/jit.h> int main(int argc, char *argv[]) { int (*pfn)(void); jit_type_t puts_params[] = { jit_type_create_pointer(jit_type_sys_char, 1) }; jit_context_t ctx = jit_context_create(); jit_context_build_start(ctx); jit_type_t sig = jit_type_create_signature(jit_abi_cdecl, jit_type_int, NULL, 0, 0); jit_function_t fun = jit_function_create(ctx, sig); jit_type_t puts_sig = jit_type_create_signature(jit_abi_cdecl, jit_type_int, puts_params, 1, 0); jit_value_t arg = jit_value_create_nint_constant(fun, jit_type_create_pointer(jit_type_sys_char, 1), (jit_nint)"Hello, world!"); jit_value_t args[] = { arg }; jit_insn_call_native(fun, "puts", puts, puts_sig, args, 1, 0); jit_value_t zero = jit_value_create_nint_constant(fun, jit_type_int, 0); jit_insn_return(fun, zero); jit_function_compile(fun); jit_context_build_end(ctx); pfn = jit_function_to_closure(fun); pfn(); jit_context_destroy(ctx); return 0; }
編譯、執行
$ export LD_LIBRARY_PATH=/usr/local/lib $ gcc main.c -o test -ljit -ggdb $ ./test Hello, world! $ gdb ./test (gdb) b main.c:25 (gdb) r (gdb) x/10i pfn 0x7ffff7f2614c: push %rbp 0x7ffff7f2614d: mov %rsp,%rbp 0x7ffff7f26150: movabs $0x555555556004,%rdi 0x7ffff7f2615a: mov $0x8,%eax 0x7ffff7f2615f: call 0x7ffff7d93980 <__GI__IO_puts> 0x7ffff7f26164: xor %eax,%eax 0x7ffff7f26166: mov %rbp,%rsp 0x7ffff7f26169: pop %rbp