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