31

有那么一刻,我为自己编写了我的第一个可能没有错误的 C 程序感到非常自豪。这是整个源代码:

int main;

即使没有 ,它也能完美编译int,但会发出警告(即使没有-Wall),作为一个致力于无错误程序的程序员,我将它们视为错误。

愉快地编译了这个应用程序后,我立即赶忙启动它。令我惊讶的是,出现了分段错误错误...


现在认真了。到底发生了什么?

我的猜测如下:这是缺少main' 的定义。这很明显,但编译器允许这样做。好的,main可以在不同的单元中定义。但即使是链接器也没有做任何事情。有什么特别的原因吗?

4

1 回答 1

20

这个词main是任何变量的合法名称。典型的用例是向编译器提供名称的函数,main编译器将其编译为目标文件,而目标文件又链接到crt0.o为运行时提供初始化(堆栈分配等)并跳转到标签main

在 C 目标文件中,符号与原型无关,并且链接器成功地将全局变量链接int main;为要跳转到的主程序。然而,这个程序是垃圾。它很可能初始化为零,但很快处理器会遇到随机指令访问程序分配的数据空间(堆栈+堆)之外的内存,或者指令流达到保留代码空间的限制。

两者都会导致分段错误。实际上,如果系统在带有执行标志的架构上运行,程序在第一次尝试跳转到数据段或页面时会出现段错误,而没有执行权限。

进一步阅读以支持评论中的讨论:数据执行保护NX_b​​it

于 2013-03-11T07:36:32.750 回答