链接(static & dynamic)
具体实现方法见《深入理解计算机系统 第三版》 仅仅整理一些思路
静态连接
连接器的任务
- 符号解析
- 重定位:汇编器生成的代码和数据节都是从地址0开始,需要将每个符号定义与一个内存位置管理,从而重定位 这些节,并修改对这些符号的引用。
三种目标文件:
- 可重定位目标文件:与其他可重定位目标文件结合,创建一个可执行文件
- 可执行目标文件
- 共享目标文件
可重定位文件格式
部分说明:
.rodata 只读数据 .symtab 符号表
.rel.text 一个.text节的位置列表,组合时需要修改
.rel.data 被模块引用或定义的所有全局变量重定位信息
符号与符号表
符号表包含该文件(m)定义和引用的符号信息
- m定义的呗其他模块引用的全局符号
- 其他模块定义被m引用的全局符号
- 只被m定义和引用的全局符号 带static的全局变量和函数
attention:不包含本地非静态的符号,这些在栈中管理<