我正在实现一个从文件加载纯代码并调用第一条指令的程序。无论我做什么,我的调用指令执行时都会出现Segmentation故障。我做错了什么?
char code[65536];
...
__asm__("movl code, %eax");
__asm__("call *%eax");
答案 0 :(得分:1)
是与您的程序兼容的“纯代码”吗?什么OS? “通常”,“纯代码”被重新定位,并且“移动”到“内存中相应的地址”,由进行适当调整的“连接加载器”。
答案 1 :(得分:1)
要生成的代码要执行 - 它必须位于可执行部分。
在x86-64上,请尝试使用
char* code = mmap(0, 1024 * 1024, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_32BIT | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
在32位系统上,map_32bit不相关(在x86-64上使用它来确保代码可以进入前2GB,并使用相对寻址)
答案 2 :(得分:0)
操作系统是Linux Ubuntu。
我知道通常就是这样做的。代码是兼容的,它来自我自己的编译器,它只生成一个带有程序代码的文件,文件中的第一条指令是main方法的第一条指令。
(我是学生,我必须手动完成,所以我学到了一些东西!;-) =
答案 3 :(得分:0)
从导入的代码返回时,使用调试器检查堆栈值,并仔细检查它是否包含有效的返回地址。如何调用导入的代码?在调用导入的代码之前是否推送任何值,导入的代码是否在最后调整堆栈?