动静态库;gcc 链接顺序,循环依赖问题

链接过程由链接器 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) 的处理就有差异了:


对于动态库,真正加载和符号解析发生在运行时(由动态链接器完成),链接时已经记录完所有的符号和库名了,不会遇到循环依赖问题。

※ 对于静态库,链接器仅提取当前未解析符号所需的对象文件,未使用的对象文件会被丢弃。

对于静态库,链接器在链接时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值