我正在尝试调用 native 机器语言代码。到目前为止,这是我所拥有的(出现总线错误):
char prog[] = {'\xc3'}; // x86 ret instruction
int main()
{
typedef double (*dfunc)();
dfunc d = (dfunc)(&prog[0]);
(*d)();
return 0;
}
它确实正确地调用了该函数并进入了 ret 指令。但是当它试图执行 ret 指令时,它有一个 SIGBUS 错误。是因为我在一个没有被清除执行的页面上执行代码吗?
那么我在这里做错了什么?
最佳答案
第一个问题可能是存储 prog 数据的位置不可执行。
至少在 Linux 上,生成的二进制文件会将全局变量的内容放在 "data" segment 中。或 here , 在 most normal cases 中不可执行.
第二个问题可能是您调用的代码在某些方面无效。调用 C 中的方法有一定的过程,称为 calling convention。 (例如,您可能正在使用“cdecl”)。被调用的函数仅仅“ret”可能是不够的。它可能还需要进行一些堆栈清理等,否则程序将出现意外行为。一旦你解决了第一个问题,这可能会成为一个问题。
关于c++ - 如何调用存储在char数组中的机器码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39867396/