如何调用存储在char数组中的机器码?

新手上路,请多包涵

我正在尝试调用本机机器语言代码。到目前为止,这是我所拥有的(出现总线错误):

 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 许可协议

阅读 298
2 个回答

第一个问题可能是存储 prog 数据的位置不可执行。

至少在 Linux 上,生成的二进制文件会将全局变量的内容放在 “数据”段此处,这在 大多数正常情况下 是不可执行的。

第二个问题可能是您调用的代码在某种程度上是无效的。在 C 中调用方法有一个特定的过程,称为 调用约定(例如,您可能正在使用“cdecl”)。被调用的函数仅仅“ret”可能是不够的。它可能还需要进行一些堆栈清理等,否则程序将出现意外行为。一旦你克服了第一个问题,这可能会成为一个问题。

原文由 Horia Coman 发布,翻译遵循 CC BY-SA 3.0 许可协议

一个明显的错误是 \xc3 没有返回 double 你声称它正在返回。

原文由 MSalters 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题