链接过程由链接器
ld负责。通常 GCC 间接驱动之。
链接过程
.o 目标文件(Object File)
.so 动态库 (Shared Object)(Windows: .dll Dynamic Link Library)
.a 静态库(Static Library)是多个.o的集合
导出符号:.当前编译单元 .o /.a 定义的、可供其他编译单元使用的符号
导入符号:需要导入,但没找到的符号
符号:
函数声明 与 函数实现
全局变量
局部静态变量
这些需要全局使用,所以进程地址空间有个数据段,代码段。
符号表在链接时用来做这些准备~
链接器ld维护两个符号表:
- 已决符号表A: 遇到的所有.o/.a的导出符号
- 未决符号表B: 遇到的所有.o/.a需要导入,但尚未找到的符号
链接器对一个 .o 文件的每个符号:
- 导出符号 加入到 已决符号表A ,若 未决符号表B 存在该符号,则删除。
若 已决符号表A 已存在该符号,则报错“多重定义” - 导入符号 若 已决符号表A 不存在该符号,则添加到表B
目标文件(.o) 会被完整纳入链接,符号全部参与解析。
静态库(.a)或动态库(.so) 的处理就有差异了:
对于动态库,真正加载和符号解析发生在运行时(由动态链接器完成),链接时已经记录完所有的符号和库名了,不会遇到循环依赖问题。
※ 对于静态库,链接器仅提取当前未解析符号所需的对象文件,未使用的对象文件会被丢弃。
对于静态库,链接器在链接时

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



