我正在尝试调用本机语言。到目前为止,这是我所拥有的(它会出现总线错误):
char prog[] = {'\xc3'}; // x86 ret instruction int main() { typedef double (*dfunc)(); dfunc d = (dfunc)(&prog[0]); (*d)(); return 0; }
它确实正确调用了函数,并且到达了ret指令。但是,当它尝试执行ret指令时,会出现SIGBUS错误。是因为我在未清除执行页面之类的代码上执行代码吗?
那我在做什么错呢?
第一个问题可能是该编数据的存储位置不可执行。
至少在Linux上,生成的二进制文件会将全局变量的内容放在“数据”段或此处,这在大多数正常情况下是不可执行的。
第二个问题可能是您正在调用的代码在某种程度上无效。在C中有一个特定的过程来调用方法,称为调用约定(例如,您可能使用的是“ cdecl”)。仅被“调用”的函数可能还不够。它可能还需要进行一些堆栈清理等操作,否则程序将表现异常。一旦解决了第一个问题,这可能会证明是一个问题。