预处理阶段:宏替换、条件编译、导入头文件、处理特殊符号
通过预处理后,就会生成一个没有宏定义、条件编译、特殊符号的输出文件,此时文件被翻译成为机器指令。
gcc -E hello.c -o hello.i //预处理把hello.c转化为hello.i文件
编译阶段:大概就是程序的语法、词法分析,确认指令是否符合语法规则,编译后的输出文件里只有常量;eg:数字、字符串、变量的定义,main、if、else、{}、+、-等
gcc -S hello.i -o hello.s //编译把hello.i文件转化成hello.s文件
汇编阶段:把汇编语言代码翻译成目标机器指令的过程
gcc -c hello.s -o hello.o //汇编把hello.s转化成汇编文件
链接阶段:将有关的目标文件彼此相连接,比如程序中调用了某个库文件中的函数,通过链接就生成了一个可执行的文件。
gcc hello.o -o hello //通过链接生成可执行文件
tips:链接分为静态链接和动态链接
静态链接:就是一个目标文件的集合,其中每个文件含有库中的一个或一组相关函数代码,在这种链接方式下,函数的代码将从其所在的静态链接库中被拷贝到最终的可执行程序中,该程序在被执行时这些代码被装入到该进程的虚拟地址空间中。
动态链接:是根据可执行程序中记录的信息找到相应的函数代码。在该链接方式下,函数的代码被放在动态链接库或共享对象的某个目标文件中,链接程序时在可执行程序中记录下共享对象的名字,在可执行文件被执行时,动态链接库的内容全部映射到运行时相应进程的虚拟地址空间。