參考資訊:
https://www.gnu.org/software/lightning/manual/lightning.html
main.c
#include <stdio.h> #include <lightning.h> int main(int argc, char *argv[]) { void (*pfn)(void); jit_state_t *_jit = NULL; init_jit(argv[0]); _jit = jit_new_state(); jit_prolog(); jit_prepare(); jit_pushargi((jit_word_t)"Hello, world!\n"); jit_finishi(printf); jit_ret(); jit_epilog(); pfn = jit_emit(); pfn(); jit_clear_state(); jit_destroy_state(); finish_jit(); return 0; }
編譯、執行
$ export LD_LIBRARY_PATH=/usr/local/lib $ gcc main.c -o test -llightning -ggdb $ ./test Hello, world! $ gdb ./test (gdb) b main.c:20 (gdb) r (gdb) x/9i pfn 0x7ffff7f79000: sub $0x18,%rsp 0x7ffff7f79004: mov %rbp,(%rsp) 0x7ffff7f79008: mov %rsp,%rbp 0x7ffff7f7900b: movabs $0x555555556004,%rdi 0x7ffff7f79015: call 0x7ffff7db35b0 <__printf> 0x7ffff7f7901a: mov %rbp,%rsp 0x7ffff7f7901d: mov (%rsp),%rbp 0x7ffff7f79021: add $0x18,%rsp 0x7ffff7f79025: ret