调用手动加载的代码(AT& T + C)(g ++)

时间:2010-09-10 12:11:26

标签: c assembly call

我正在实现一个从文件加载纯代码并调用第一条指令的程序。无论我做什么,我的调用指令执行时都会出现Segmentation故障。我做错了什么?

char code[65536];
...
__asm__("movl code, %eax");
__asm__("call *%eax");

4 个答案:

答案 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)

从导入的代码返回时,使用调试器检查堆栈值,并仔细检查它是否包含有效的返回地址。如何调用导入的代码?在调用导入的代码之前是否推送任何值,导入的代码是否在最后调整堆栈?