读书,是为了思考和权衡。
gcc -E file.c -o file.i // 预处理
gcc -s file.i -o file.s // 生成汇编代码
gcc -c file.c -o file.o // 编译生成的则是一个可重定位的目标文件
gcc file.c -o file // 生成elf文件
1. 可执行文件的建立过程
(1)源码 ——> 预编译 ——>编译 ——> 汇编 ——>链接 ——>可执行文件。
2. 预编译
(1)处理以“#”开始的预编译指令。
- 替换:#include #define
- 条件编译:“#if”、“#endif”、“#ifdef”、“#elif”和“#else。
- 保留:#program
(2)删除注释
(3)添加行号和文件标识。
(4)xxx.i
3. 编译
(1)词法分析
(2)语法分析
(3)语义分析
(4)优化
- 中间代码优化(无用变量删除、除用移位替换等)
- 针对不同硬件特点的优化。
(5)由代码生成器将优化后的中间代码生成汇编代码文件。
(6)xxx.s
4. 汇编
(1)将汇编语言代码翻译成机器语言,得到目标文件。
(2)目标文件由段组成,至少包含两段:代码段和数据段。
- 代码段:程序的指令。可读可执行,不可写。
- 数据段:程序中的全局变量、静态数据。
(3)xxx.o
5. 链接
(1)符号收集
(2)符号解析:将每个符号的引用和一个符号定义连接起来。
- 强符号:函数和已初始化的全局变量为强符号。
- 弱符号:未初始化的全局变量为弱符号。
- 符号解析原则:多个强符号,报错;一强多弱选强;多弱随机选(也有说选内存占用最大的那个)。
(3)符号定位