为什么以下2个(简化)示例会出现段错误(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 部分并跳转到内存的不可执行部分。(或类似的东西)。我的问题是“为什么”在大局意义上:
究竟是什么系统强制执行的?是在操作系统级别吗?在硬件层面?在硬件级别,但在将二进制文件加载到内存时需要由操作系统设置?这是什么子系统?ETC...
也许“如何”比“为什么”是一个更好的问题。