能否部分链接归档文件?如何让ld提取.a中所有目标文件并链接
解决思路:提取归档库所有目标文件并合并为单个重定位目标文件
首先明确核心问题:ld -r处理.a归档时,默认只会提取能解决当前未定义符号的目标文件。你单独执行ld -r -o test.o lib.a时,没有任何未定义符号需要解决,所以ld根本没提取归档里的内容,生成的test.o自然极小。
下面提供三种可行方法,均能让ld把归档内所有目标文件合并成一个大的.o文件,满足你提前解析引用、加速后续构建的需求:
方法1:手动提取归档文件再合并
先把.a里的所有.o解压出来,再用ld合并:
# 创建临时目录存放解压的目标文件 mkdir -p temp && cd temp # 解压归档库 ar x ../lib.a # 合并所有目标文件为单个test.o ld -r -o ../test.o *.o # 清理临时文件 cd .. && rm -rf temp
把这些命令写成脚本,每次更新库后执行即可。
方法2:用objcopy直接转换归档
GNU objcopy支持直接将归档文件转为单个重定位目标文件,命令更简洁:
# 注意:elf64-x86-64是64位x86架构格式,32位用elf32-i386,可通过objdump -f lib.a查看架构 objcopy -I archive -O elf64-x86-64 lib.a test.o
方法3:借助gcc的链接选项
如果习惯用gcc而非直接调用ld,可通过--whole-archive选项强制ld包含归档里的所有内容:
gcc -r -nostdlib -o test.o -Wl,--whole-archive lib.a -Wl,--no-whole-archive
其中-Wl,--whole-archive告诉ld要链接归档内所有文件,-Wl,--no-whole-archive用于重置默认行为,避免后续其他库也被强制全量包含。
合并后的test.o包含原lib.a的所有内容,后续生成数百个可执行文件时,直接链接这个test.o即可,ld无需反复解析原归档库,能大幅减少重复的链接工作,提升构建速度。
内容的提问来源于stack exchange,提问作者steviekm3
相关产品推荐
相关产品推荐

