编译链接概论
- 预编译
- 编译
- 汇编
- 链接
预编译
- 处理以#开头的预编译指令
- gcc -E hello.c -o hello.i /g++ hello.c > hello.i
- 删除#define, 展开宏定义
- 处理条件预编译 #if。。。。
- 递归处理#include,
- 删除注释
- 添加行号和文件名
- 保留所有的#pragma, 编译器要使用
编译
- gcc -S hello.i -o hello.s //生成汇编
- 词法分析
- 语法分析
- 语义分析
- 分析静态语义,动态语义运行时才能确定
- 中间语言生成
- 源代码级别的优化 比如 1 + 2 直接标识成3
- 目标代码生成与优化
- 代码生成器:中间语言转换为目标机器代码,生成汇编代码,依赖机器属性
- 优化汇编
汇编
- gcc -c hello.s -o hello.o
- 生成二进制机器语言
链接
- 地址和空间分配, 符号决议,符号重定位
- 静态链接过程
- main引用其他模块的函数符号,链接器根据符号名(函数签名)自动去相应模块找该函数地址,然后重新修正main函数中该函数的地址;
posted on 2019-04-24 22:00 slowlyChange 阅读(99) 评论(0) 编辑 收藏 举报