我尝试通过将标签之间的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
但我不能在没有记忆错误的情况下阅读它
我会很高兴任何链接或任何建议如何实现这个
答案 0 :(得分:2)
将执行转移到任意位置的唯一合法方法是使用函数指针。 goto
只跳转到标签,而不是数组或其他任何内容。
此外,您无法获取标签的地址。标签不是对象或功能。
正确地指出,数据区域通常放在内存中,其内容不能作为CPU指令执行。但是,通常有解决方法。 Windows和Linux提供的功能可以更改内存区域的权限/权限/权限/无论你调用它。
例如,这是an example做你想在Windows上做的事情。
答案 1 :(得分:1)
只是对Alexey的回答的补充,我将链接我自己的创建jit-executor的样本。
How to make a C program that can run x86 hex codes
AsmJIT library是一个很好的x86 / x64“单行”汇编程序,它实际上创建了一个完整的可执行内存块。
jit引擎的便携版本是LuaJIT。它支持为ARM / x86 / PowerPC / MIPS架构创建功能蹦床。
关于“指向标签的指针”的事情在C中不能成为标准,因为存在数据和代码不共享相同内存的硬件架构。