《深入理解计算机系统》读书笔记(七)链接
前言
继续阅读《深入理解计算机系统》这本经典书籍
本节是第七章
链接
1、编译器驱动程序
链接:将各种代码和数据片段收集并组合成为一个单一文件的过程
一个例子
其静态链接过程
链接器完成主要任务:
- 符号解析:每个符号引用和一个符号定义关联
- 重定位:把每个符号定义和一个内存位置关联,修改对应的符号引用
动态链接过程
2、目标文件
三种形式
- 可重定位目标文件:编译器和汇编器形成,二进制代码+数据,可以在编译时相互合并,创建可执行目标文件
- 可执行目标文件:链接器形成,二进制代码+数据,可以复制到内存并执行
- 共享目标文件:特殊的可重定位目标文件,可以动态加载进内存并链接
可重定位目标文件
一个典型的ELF可重定位目标文件
各节
- .text:已编译程序的机器代码
- .rodata:只读数据
- .data:初始化的全局和静态C变量
- .bss:未初始化或初始化为0的全局和静态C变量
- .symtab:程序中定义和引用的函数和全局变量的信息
- .rel.text: .text节中位置的列表
- .tel.data.:被引用或定义的所有全局变量的重定位信息
- .debug:调试符号表
- .line:源程序的行号和.text中机器代码之间的映射
- .strtab:字符串表
可执行目标文件
可执行目标文件加载到内存中如下
3、符号
每个可重定位目标模块m都有一个符号表
在链接器中有三种符号
对全局符号的解析很棘手
若有多重定义
编译器在输出时有强弱之分
- 强符号:函数和初始化的全局变量
- 弱符号:未初始化的全局变量
链接器处理规则:
- 不允许有多个同名强符号
- 一强多弱则选强
- 多弱则随机选一个
- 多强则报错
4、重定位
结语
了解链接的过程
- 主要是三种文件
- 符号解析和重定位
- 静态动态链接