程式語言 - GNU - Lightning - Hello, world!



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