1. 基本概念:
-
编译过程:
- 源代码文件->可重定位目标文件->经链接后的可执行目标文件
-
为什么需要链接?
- 模块化:程序可以写成一个较小的模块的集合,可以构造通用函数的库
- 效率:
- 时间效率:修改文件时,可以只编译修改的文件,不需要其它文件进行编译,然后重新链接。
- 空间效率:常用的函数可以集合到单个文件中,可执行文件和内存镜像只包含实际使用的函数代码。
-
什么是目标文件?
- 可重定位目标文件(.o文件):包含某种形式的代码和数据,可以与其它形式的可重定位目标文件组合成可执行目标文件。
- 可执行目标文件(a.out文件):可以直接复制到内存执行的文件。
- 共享目标文件(.so文件):特殊的可重定位目标文件,可以动态加载到内存中进行链接
-
ELF文件结构
- 全局符号:非静态的C函数和全局变量。
- 外部符号:被引用的全局符号。
- 局部符号:带static的全局变量和C函数。
- .symtab符号表: 描述当前ELF文件中定义的和引用的符号
2. 静态链接:
- 符号解析:将每个引用(外部符号)与其它可重定向目标文件中的符号定义关联起来
- 多重定义的全局符号:
- 强符号:已初始化的全局变量和函数
- 弱符号:未初始化的全局变量
- 解析规则
- 多个同名强符号会报错
- 一个强符号和多个弱符号同名,会选择强符号
- 多个弱符号同名,随机选择