细说编译性语言的编译四大阶段

编译的四个阶段:预处理(扩展各个宏与文件)、编译(得到汇编代码)、汇编(得到机器码)、链接(得到可执行文件)

一. 编译时达到的每一个阶段

可以使用 gcc 一个 -save-temps 参数编译源代码,会把编译整个过程的中间文件保存下来,不删除。

# 预处理阶段:gcc -E Hello.c
	* 得到一个 *.i 后缀的文件。
    * 源代码里以 “#” 开头的命令是“预处理命令”,例如:“#define”,"#include","ifndef"等。
# 编译阶段:gcc -S Hello.c
	* 得到一个 *.s 后缀的汇编语言的汇编代码文件。
	* 在此编译阶段中编译器会依次进行:词法分析、语法分析、代码优化、存储分配、代码生成 这五个步骤。
	* 进行的方式是“多次扫描的方式”:编译器每次扫描源代码只完成一个上面五个步骤,依次扫描进行完成上面的五个步骤。
# 汇编阶段:gcc -c Hello.c
	* 得到一个 *.o 后缀的目的文件。
	* 汇编阶段就是汇编器 ar 把汇编代码翻译成机器码。
# 链接阶段:gcc Hello.c
	* 得到一个 *.o 后缀的可执行文件。
	* 链接阶段就是连接器 ld 把汇编生成的 .o 目的文件,与其他 .o 目的文件、库文件链接起来,生成可执行 .o 文件。

二. ELF文件

  1. ELF的三种类型
    • 可执行文件(Executable File)
    • 可重定位文件(Relocatable File 后缀为 .o)
    • 共享目标文件(Shared Object File 后缀 .so)
  2. ELF文件的作用