參考資訊:
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