C 语言文件的编译的4个阶段:
源代码(.c / .cpp文件)
-> (1.) 预编译阶段(操作符 gcc -E)。
预处理器在源代码上执行一些文本操作。例如,用实际值代替由#define指令定义的符号以及读入由#include指令包含的文件内容。
-> (2.)编译阶段(操作符 gcc -S)。
源代码经过解析,判断它的意思。这个阶段是产生绝大多数错误和警告信息的地方。编译器优化程序并最后生成汇编级指令(此阶段产生文件名后缀为 .s)。
-> (3.)汇编阶段(操作符 gcc -C)。
汇编文件经过汇编器的处理,将文件中的汇编级指令转化成包含机器指令的目标文件。这一阶段只把现有的代码转换成机器代码,而像printf()这样的函数调用暂不解析。这阶段的机器级文件打开不可读。(这一阶段产生的目标文件名后缀为 .o)。
-> (4.)链接阶段(操作符 gcc)。
这是最后的阶段,是将目标文件和其他目标代码(多文件编译的话)以及库文件进行链接。所以printf()函数在库文件中解析翻译,程序才知道这个函数到底输出什么(之前只是简单的采用占位符)。
编译器也做一些额外的操作:它把一些程序开始运行和程序结束运行时所需的附加代码合并到程序中。这样产生最后的可执行文件既二进制文件。
C 语言文件的执行的4个阶段:
(1.)首先,程序必须载入内存中,这个任务由操作系统完成。 那些不是储存在堆栈中的尚未初始化的变量将在这个时候得到初值。
(2.)执行开始,通常一个小型的启动程序与程序链接起来,它负责处理一系列日常任务,如收集命名行参数以便程序能够访问它,等等。
(3.)调用main(),开始执行程序代码。在绝大数机器中,程序将使用一个运行时的堆栈,它用于储存函数的局部变量和返回地址。
(4.)程序终止。终止的产生原因有很多,可能是正常终止,既main()返回。也有可能是在执行过程中产生错误自行终止,比如core dump 。也有可能是用户按下break自行退出。