1 编译
大多数编译系统提供编译器驱动程序,包括语言处理器、编译器、汇编器和链接器。以main.cpp和sum.cpp为例:
main.cpp
sum.cpp
1.1 预编译
对源程序中的宏定义、包含头文件(#开头的代码,如#include,#pragma lib/link除外)等进行处理,生成后缀名为.i的文件。
g++ -E main.cpp -o main.i
驱动程序运行预处理器(cpp),将main.c翻译成一个ASCII码的中间件文件main.i
1.2 编译
语义分析、词法分析、代码优化等,用g++命令执行,使用-S 选项,可以将预处理之后的.i文件转换为目标机器的汇编代码.S文件。
g++ -S main.i -o main.s
1.3 汇编
汇编:生成二进制可重定位的目标文件(*.obj),将汇编码转换为特定平台(x86/AT&T(UNIX系统))的机器码(01)。编译过程中,符号不分配虚拟地址。
g++ -c main.s -o main.o
*.o文件的组成格式:
在Linux中使用objdump可以查看符号表
objdump -t main.o
2 链接--->.exe/.out
编译完成的所有.o文件和静态库文件(静态库文件*.a,Windows下为*.lib)
2.1 符号解析
所有.o文件段的合并,符号表合并后,进行符号解析
2.2 重定位
可执行文件的组成格式