參考資訊:
https://www.gnu.org/software/lightning/manual/lightning.html
main.c
#include <stdio.h> #include <lightning.h> static jit_state_t *_jit; typedef void (*pvfi)(int); int main(int argc, char *argv[]) { pvfi myFunction = NULL; jit_node_t *start = NULL; jit_node_t *end = NULL; init_jit(argv[0]); _jit = jit_new_state(); start = jit_note(__FILE__, __LINE__); jit_prolog(); jit_prepare(); jit_pushargi((jit_word_t)"Hello, world!\n"); jit_finishi(printf); jit_ret(); jit_epilog(); end = jit_note(__FILE__, __LINE__); myFunction = jit_emit(); myFunction((char*)jit_address(end) - (char*)jit_address(start)); 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:27 (gdb) r Breakpoint 1, main (argc=1, argv=0x7fffffffdb48) at main.c:27 27 myFunction((char*)jit_address(end) - (char*)jit_address(start)); (gdb) b *myFunction Breakpoint 2 at 0x7ffff7f73000 (gdb) c (gdb) x/20i 0x7ffff7f73000 => 0x7ffff7f73000: sub $0x18,%rsp 0x7ffff7f73004: mov %rbp,(%rsp) 0x7ffff7f73008: mov %rsp,%rbp 0x7ffff7f7300b: movabs $0x55555555600b,%rdi 0x7ffff7f73015: call 0x7ffff7c606f0 <__printf> 0x7ffff7f7301a: mov %rbp,%rsp 0x7ffff7f7301d: mov (%rsp),%rbp 0x7ffff7f73021: add $0x18,%rsp 0x7ffff7f73025: ret