我正在try 调用本地机器语言代码.以下是我到目前为止所拥有的(它得到一个总线错误):

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" segmenthere中,这在most normal cases中是不可执行的.

第二个问题可能是,您正在调用的代码在某种程度上是无效的.在C中调用方法有一个特定的过程,称为calling convention(例如,您可能使用"cdecl"方法).被调用函数仅仅"ret"可能还不够.它可能还需要执行一些堆栈清理等操作,否则程序将意外运行.一旦你解决了第一个问题,这可能会成为一个问题.

C++相关问答推荐

如何在Scilab API中求解方程

在严格的C89模式下,收件箱不会在' uint64_t '上发出警告

漏洞仅出现在FreeBSD上,但在Windows、Linux和MacOS上运行得非常好

如何将匿名VLA分配给指针?

如何正确地索引C中的 struct 指针数组?

在struct中调用函数,但struct在void中 *

数据包未从DPDK端口传输到内核端口

ATmega328P EEPROM未写入

如何知道我是否从非阻塞套接字读取所有内容

<;unistd.h>;和<;sys/unistd.h>;之间有什么区别?

无法访问共享目标文件内的共享指针

C堆栈(使用动态数组)realloc内存泄漏问题

安全倒计时循环

有没有一种方法可以用C创建保留限定符的函数?

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

在C中使用无符号整数模拟有符号整数

与外部SPI闪存通信时是否应禁用中断?

DennisM.Ritchie的C编程语言一书中关于二进制搜索的代码出现错误?

如何修复数组数据与列标题未对齐的问题?

使用邻接表创建图