參考資訊:
https://github.com/dibyendumajumdar/nanojit
main.cpp
#include <stdio.h> #include <nanojitextra.h> static void myfun(void) { printf("Hello, world!\n"); } int main(int argc, char *argv[]) { int (*pfn)(void); NJXContextRef jit = NJX_create_context(true); NJX_register_C_function(jit, "myfun", reinterpret_cast<void *>(myfun), NJXValueKind_V, nullptr, 0); NJXFunctionBuilderRef builder = NJX_create_function_builder(jit, "test", NJXValueKind_I, nullptr, 0, true); NJX_callv(builder, "myfun", NJXCallAbiKind::NJX_CALLABI_CDECL, 0, nullptr); auto zero = NJX_immi(builder, 0); auto ret = NJX_reti(builder, zero); pfn = (int (*)(void))NJX_finalize(builder); NJX_destroy_function_builder(builder); pfn(); NJX_destroy_context(jit); return 0; }
編譯、執行
$ export LD_LIBRARY_PATH=/usr/local/lib $ g++ main.cpp -o test -I/usr/local/include/nanojit /usr/local/lib/libnanojitextra.so -ggdb $ ./test Hello, world! $ gdb ./test (gdb) b main.cpp:21 (gdb) r (gdb) x/20i f 0x7ffff7f7bfa4: push %rbp 0x7ffff7f7bfa5: mov %rsp,%rbp 0x7ffff7f7bfa8: sub $0x30,%rsp 0x7ffff7f7bfac: mov %rbx,-0x28(%rbp) 0x7ffff7f7bfb0: mov %r12,-0x20(%rbp) 0x7ffff7f7bfb4: mov %r13,-0x18(%rbp) 0x7ffff7f7bfb8: mov %r14,-0x10(%rbp) 0x7ffff7f7bfbc: mov %r15,-0x8(%rbp) 0x7ffff7f7bfc0: movabs $0x555555555269,%rax 0x7ffff7f7bfca: call *%rax 0x7ffff7f7bfcc: xor %eax,%eax 0x7ffff7f7bfce: mov %rbp,%rsp 0x7ffff7f7bfd1: pop %rbp 0x7ffff7f7bfd2: ret