跳转为JIT(x86_64)[重复]

问题描述 投票:4回答:2

这个问题在这里已有答案:

我正在用C语言编写一个用于x86_64 linux的JIT编译器。

目前,想法是在可执行存储器的缓冲区中生成一些字节码(例如,通过mmap调用获得)并用函数指针跳转到它。

我希望能够将多个可执行存储器块链接在一起,以便它们可以仅使用本机指令在彼此之间跳转。

理想情况下,可执行块的C级指针可以作为绝对跳转地址写入另一个块,如下所示:

unsigned char *code_1 = { 0xAB, 0xCD, ... };
void *exec_block_1 = mmap(code1, ... );
write_bytecode(code_1, code_block_1);
...
unsigned char *code_2 = { 0xAB, 0xCD, ... , exec_block_1, ... };
void *exec_block_2 = mmap(code2, ... );
write_bytecode(code_2, exec_block_2); // bytecode contains code_block_1 as a jump
                                      // address so that the code in the second block
                                      // can jump to the code in the first block

但是我发现x86_64的局限性在这里是一个很大的障碍。由于所有可用的64位跳转操作都与指令指针相关,因此无法跳转到x86_64中的绝对64位地址。这意味着我不能将C指针用作生成代码的跳转目标。

是否有解决这个问题的方法可以让我以我描述的方式将块链接在一起?也许是我不知道的x86_64指令?

assembly compiler-construction x86-64 jit machine-code
2个回答
© www.soinside.com 2019 - 2024. All rights reserved.