为何部分链接会将全局符号转换为局部符号?
部分链接后全局符号转为局部的问题排查求助
问题背景
我需要将包含约3000个小型目标文件(.o)的大型静态库libIn.a合并为单个.o文件以减小磁盘占用,该操作即「部分链接」——通过合并每个.o文件的段来实现体积缩减。但操作后遇到问题:libIn.a中.o文件的全局符号全部变为局部符号,导致后续链接过程出现「未定义符号」错误。
现象对比
问题案例:version.o
部分链接前,用nm -Ca查看version.o的符号:
└─ nm -Ca version.o 0000000000000000 T webrtc::LoadWebRTCVersionInRegister() 0000000000000024 s l_.str 0000000000000000 t ltmp0 0000000000000024 s ltmp1
此时webrtc::LoadWebRTCVersionInRegister()为全局符号(标记为T)。
执行部分链接命令ld -r version.o -o why_is_local.o后,再次查看符号:
└─ nm -Ca why_is_local.o 0000000000000024 s LC1 0000000000000000 t webrtc::LoadWebRTCVersionInRegister()
该符号变为局部符号(标记为t)。
正常测试案例:自定义file1.cc
编写如下C++代码:
int function1() { return 1; }
编译后查看符号:
└─ clang -c file1.cc └─ nm -Ca file1.o 0000000000000000 T function1() 0000000000000000 t ltmp0 0000000000000008 s ltmp1
执行部分链接后,符号仍保持全局:
└─ ld -r file1.o -o relocated.o └─ nm -Ca relocated.o 0000000000000000 T function1()
环境信息
运行环境为MacOS 12.6(arm64),工具版本如下:
└─ clang -v Apple clang version 13.0.0 (clang-1300.0.29.3) Target: arm64-apple-darwin21.6.0 Thread model: posix InstalledDir: /Users/giober/Desktop/XCodes/13.1/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin └─ ld -v @(#)PROGRAM:ld PROJECT:ld64-711 BUILD 18:11:19 Aug 3 2021 configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em LTO support using: LLVM version 13.0.0, (clang-1300.0.29.3) (static support for 27, runtime is 27) TAPI support using: Apple TAPI version 13.0.0 (tapi-1300.0.6.5) └─ nm --version Apple LLVM version 13.0.0 (clang-1300.0.29.3) Optimized build. Default target: arm64-apple-darwin21.6.0 Host CPU: vortex
求助需求
version.o与file1.o之间必然存在导致符号属性变化差异的原因,但我尚未定位到,恳请提供排查思路。
内容的提问来源于stack exchange,提问作者Giovanni Beri
相关产品推荐
相关产品推荐

