我正在尝试调用本机机器语言代码。到目前为止,这是我所拥有的(出现总线错误):
char prog[] = {'\xc3'}; // x86 ret instruction
int main()
{
typedef double (*dfunc)();
dfunc d = (dfunc)(&prog[0]);
(*d)();
return 0;
}
它确实正确调用了该函数并进入了 ret 指令。但是当它试图执行 ret 指令时,它有一个 SIGBUS 错误。是因为我在一个没有被清除执行的页面上执行代码或类似的东西吗?
那么我在这里做错了什么?
原文由 user5406764 发布,翻译遵循 CC BY-SA 4.0 许可协议
第一个问题可能是存储 prog 数据的位置不可执行。
至少在 Linux 上,生成的二进制文件会将全局变量的内容放在 “数据”段 或 此处,这在 大多数正常情况下 是不可执行的。
第二个问题可能是您调用的代码在某种程度上是无效的。在 C 中调用方法有一个特定的过程,称为 调用约定(例如,您可能正在使用“cdecl”)。被调用的函数仅仅“ret”可能是不够的。它可能还需要进行一些堆栈清理等,否则程序将出现意外行为。一旦你克服了第一个问题,这可能会成为一个问题。