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

macOS内置ld找不到目标文件内已定义符号 lld可正常完成链接

问题描述

在使用macOS内置的ld链接器执行链接操作时,出现如下报错:

ld -arch x86_64 -platform_version macos 11.0 12.2.1 -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk -lSystem -lc++ -o /Users/blashyrk/Documents/source/nim/asserttrigger /Users/blashyrk/.cache/nim/asserttrigger_d/asserttrigger.o 

Undefined symbols for architecture x86_64:
  "_nlvmEHPersonality", referenced from:
  Dwarf Exception Unwind Info (__eh_frame) in asserttrigger.o
ld: symbol(s) not found for architecture x86_64

报错提示x86_64架构下存在未定义符号_nlvmEHPersonality,该符号被asserttrigger.o中的Dwarf异常展开信息(__eh_frame)引用。但该符号对应的函数实际就定义在这个目标文件内部,使用objdump查看目标文件符号表,已确认该函数存在:

objdump -t ~/.cache/nim/asserttrigger_d/asserttrigger.o | grep nlvmEH
00000000000063b0 l     F __TEXT,__text _nlvmEHPersonality

通过Ghidra反编译工具也可确认该函数确实存在于目标文件中。
使用LLVM项目的lld链接器执行相同链接操作可成功完成,说明符号本身的定义是合规的。待确认问题如下:

  • macOS自带的ld无法找到该符号的原因是什么?
  • 是否遗漏了必要的链接参数?
  • ld是否要求EH personality函数必须归属外部目标文件或依赖库?

Ghidra验证截图

问题原因

这是macOS原生ld链接器对异常处理personality符号的特殊校验规则导致的,和符号是否真实存在于目标文件无关:

  • 上述符号表输出中_nlvmEHPersonality的类型标记为l,属于本地(local)符号,仅在目标文件内部做地址偏移计算使用,不会作为导出符号参与全局符号解析。而macOS原生ld在解析__eh_frame段引用的personality函数时,只会检索全局(global)类型的导出符号,会直接跳过所有本地符号,哪怕符号名称、地址完全匹配也不会被识别。
  • LLVM的lld没有实现这层强制校验逻辑,只要符号名匹配就会解析对应引用,因此可以正常完成链接。
  • 原生ld不存在“EH personality函数必须放在外部目标文件或依赖库”的强制要求,只要符号为全局可见属性,哪怕定义在当前待链接的目标文件内,也能被正常识别。
解决方法

不需要额外添加链接参数,只要将_nlvmEHPersonality符号的可见性从本地(local)修改为全局(global)即可解决问题:

  • 如果是自行编译生成目标文件,给该函数添加全局可见标记即可:C/C++代码中不要使用static修饰该函数,手写汇编时添加.globl _nlvmEHPersonality声明。
  • 如果是第三方工具生成的目标文件、无法修改源码,可以通过nmedit、objconv这类Mach-O符号编辑工具直接修改对应符号的可见性属性,也可以先通过ld -r执行一次可重定位中间链接将本地符号提升为全局,之后再执行最终链接就不会触发该报错。

实测验证:将目标文件内的_nlvmEHPersonality修改为全局符号后,使用原生命令即可链接成功,生成的二进制文件运行后无输出直接退出,符合预期表现。

内容的提问来源于stack exchange,提问作者blashyrk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:06:29