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

标签 c++ c linux native machine-code

我正在尝试调用 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/

相关文章:

使用 Ragel 解析器捕获字段

c# - 在 C# 中通过 SSH 连接到 Ubuntu VM

linux - Shell 命令获取访问日期/时间最少的目录

使用类、getline 和 stringstream 进行解析的 C++ 练习

c++ - 有没有更好的方法在循环时显示不同的文本并询问相同的变量而不添加 X while 循环?

c - 删除链表中包含用户输入的字母的元素

linux - 给/var/www/site1 到 www-data :www-data crashes all WP sites on server

c++ - 删除重复的枚举元素

c++ - 使用 int 和 string boost::interprocess 映射

c++ - qpixmap.scaled 函数不工作