1.gcc分步编译链接
(1) 预编译 : gcc -E main.c -o main.i
(2) 编译: gcc -S main.i -o main.s
(3) 汇编: gcc -c main.s -o main.o
(4) 链接: gcc main.o -o main
多文件编译链接:【gcc -o main main.c max.c add.c】
2.编译链接过程
(1)预编译阶段
a) 删除所有的“#define”,并且展开所有的宏定义;
b) 处理所有的条件预编译指令,“#if”、“#ifdef”、“#endif”等;
c) 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;
d) 删除所有的注释;
e) 添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时显示行号;
f) 保留所有的#pragma 编译器指令,因为编译器需要使用它们。
(2)编译阶段
词法分析、语法分析、语义分析,代码优化,汇总符号。
(3)汇编阶段
将汇编指令翻译成二进制格式,生成各个 section,生成符号表。
(4)链接阶段
a) 合并各个 section,调整 section 的起始位移和段大小,合并符号表,进行符号解析, 给符号分配虚拟地址
b) 符号重定位
3.makefile和make
make 命令根据