C(或asm):如何执行存储在内存中的C代码(从标签复制)



我试图通过在标签之间将C代码中的代码段复制到malloc分配的内存来"内联"我的VM。所以我用开始和结束标签定义了Ops,我想把下面代码定义的指令复制到缓冲区,然后执行(我不确定这是否可能)

OP_PUSH0_START:
    sp += 4; *sp = 0; // I WANT THE INSTRUCTIONS OF THIS LINE COPIED TO THE BUFFER
OP_PUSH0_END:

为了做到这一点,我认为下面的代码片段将工作

void * ptr0 = &&OP_PUSH0_START;
void * ptr1 = &&OP_PUSH0_END;
while(ptr0 < ptr1)
{
    buf[c++] = *ptr0;
    ptr0++;
}
goto buf; //jump to start of buffer

但我不能偷听读出它而不得到一个内存错误

我很高兴有任何链接或任何建议如何实现这个

将执行转移到任意位置的唯一合法方法是使用函数指针。goto只跳转到标签,而不是数组或其他任何内容。

此外,您不能获取标签的地址。标签不是对象或函数。

有人正确地指出,数据区通常放在存储器中,其内容不能作为CPU指令执行。然而,通常有解决办法。Windows和Linux提供了更改内存区域的权限/权限/特权的功能。

例如,这里有一个在Windows上做你想做的事情的例子。

除了Alexey的回答之外,我还将链接我自己创建jit执行器的示例。

如何制作一个可以运行x86十六进制代码的C程序

AsmJIT库是一个很好的x86/x64"单行"汇编程序,它实际上创建了一个完整的可执行内存块。

jit引擎的可移植版本是LuaJIT。它支持为ARM/x86/PPowerPC/MIPS体系结构创建功能蹦床。

"指向标签的指针"在C中不可能是标准的,因为有些硬件架构中的数据和代码不共享同一内存。

最新更新