You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何部分链接会将全局符号转换为局部符号?

部分链接后全局符号转为局部的问题排查求助

问题背景

我需要将包含约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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 06:21:37