Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用手动加载的代码(AT&;T&x2B;C)(g&x2B;&x2B;)_C_Assembly_Call - Fatal编程技术网

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

调用手动加载的代码(AT&;T&x2B;C)(g&x2B;&x2B;),c,assembly,call,C,Assembly,Call,我正在实现一个程序,它从文件中加载纯代码并调用第一条指令。无论我做什么,当我的call指令被执行时,我都会遇到一个分段错误。我做错了什么 char code[65536]; ... __asm__("movl code, %eax"); __asm__("call *%eax"); “纯代码”是否与您的程序兼容?什么操作系统?正常情况下,“纯代码”会被重新定位,并且会被执行适当调整的“链接加载程序”移动到内存中相应的地址。OS是Linux Ubuntu 我知道通常是这样做的。代码是兼容的,它来

我正在实现一个程序,它从文件中加载纯代码并调用第一条指令。无论我做什么,当我的call指令被执行时,我都会遇到一个分段错误。我做错了什么

char code[65536];
...
__asm__("movl code, %eax");
__asm__("call *%eax");
“纯代码”是否与您的程序兼容?什么操作系统?正常情况下,“纯代码”会被重新定位,并且会被执行适当调整的“链接加载程序”移动到内存中相应的地址。

OS是Linux Ubuntu

我知道通常是这样做的。代码是兼容的,它来自我自己的编译器,它只使用程序代码生成一个文件,文件中的第一条指令是主方法的第一条指令


(我是一名学生,我必须手动执行,所以我学到了一些东西!;-)=

要执行生成的代码,它必须位于可执行部分

在x86-64上,请尝试此选项

char* code = mmap(0, 1024 * 1024, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_32BIT | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

在32位系统上,map_32位不相关(在x86-64上使用它以确保代码可以进入前2GB,并使用相对寻址)

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

不作为答案发布,因为我不知道该怎么办,但程序的数据部分(代码所在的位置)可能被标记为不可执行。这不是答案。这应该是你问题的编辑。嗨!这似乎有些作用。我仍然在某个地方遇到了SEGFULT,但不是从call指令中得到的。然而,你能解释一下这到底是在做什么吗?它在进程的地址空间中创建了一个1Mb的区域,该区域是可读写和可执行的,而不是共享的。注意:您可以使用相同的调用将文件直接映射到地址空间。这是否会以任何方式干扰生成的代码?它必须以不同的方式生成吗?我这样问是因为代码只包含一个return:ret0(C3)就可以了!但是这个代码:ENTER 0,0(C8 00)LEAVE(C9)RET 0(C3)没有,我看不出ENTER或LEAVE如何触发分段错误。您还可以使用mmap将包含可执行代码的文件映射到程序中。然后通过
my\u compiler program.source--output=program
然后
my\u run program
运行一个新程序。我的跑步几乎全部由
int(*x)(void)组成;x=mmap(…);如果(x){return x();}
我从导入的代码返回时无法检查值,因为我在前面使用某些指令(如LEAVE、ENTER)时收到segfault。不,我不推送任何值!我称之为我在第一个问题中描述的,但分配和映射内存就像“auscoder”建议的那样。我已经在前面的评论中描述了哪些代码有效,哪些代码无效。(RET(C3)工作正常,但输入0,0(C8 00)离开(C9)RET(C3)不工作)。但你认为问题可能是什么?