參考資訊:
https://luajit.org/dynasm.html
https://luajit.org/download.html
https://hackmd.io/@RinHizakura/SkvY4N9cv
https://corsix.github.io/dynasm-doc/tutorial.html
main.c
#include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include "dasm_proto.h" #include "dasm_x86.h" int main(int argc, char* argv[]) { size_t len = 0; void *buf = NULL; int (*pfn)(void); dasm_State *d = NULL; |.arch x64 |.section code dasm_init(&d, DASM_MAXSECTION); |.globals lbl_ void *labels[lbl__MAX] = { 0 }; dasm_setupglobal(&d, labels, lbl__MAX); |.actionlist bf_actions dasm_setup(&d, bf_actions); dasm_State **Dst = &d; |.code |->test: | mov rax, 100 | ret dasm_link(&d, &len); buf = mmap(0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); dasm_encode(&d, buf); mprotect(buf, len, PROT_READ | PROT_EXEC); dasm_free(&d); pfn = labels[lbl_test]; printf("r=%d\n", pfn()); munmap(buf, len); return 0; }
編譯、執行
$ luajit -v LuaJIT 2.1.1753364724 -- Copyright (C) 2005-2025 Mike Pall. https://luajit.org/ $ luajit /opt/luajit/dynasm/dynasm.lua -o x64.c -D X64 main.c $ gcc x64.c -o test -I/opt/luajit/dynasm $ ./test r=100