【发布时间】:2013-09-21 20:50:44
【问题描述】:
为什么下面2个(简化的)例子会出现segfault(Win7下用GCC编译)?
案例 1- 写入函数指针
void f() {return;}
int main()
{
memcpy(&f, "", 1);
return 0;
}
案例 2 - 调用数据指针
char f[] ={0xC3};
typedef void(*p)();
int main()
{
((p)f)();
return 0;
}
我知道这是因为我正在编写内存的 RO 部分并跳转到内存的不可执行部分。 (或类似的东西)。我的问题是“为什么”在大局意义上:
什么系统确切地执行了这一点?是在操作系统级别吗?在硬件层面?在硬件级别,但在将二进制文件加载到内存时需要由操作系统设置?这是什么子系统?等等……
也许“如何”比“为什么”更好。
【问题讨论】:
-
如果您在 PC 或 Mac 平台上,它是由操作系统强制执行的,因为您通常不会编写将内容放入闪存的代码(无论如何都不会使用典型的应用程序开发工具)。各种嵌入式系统可能会设计有一些硬件强制执行。但通常是操作系统。