AddressSanitizer构建的命令行工具运行时出现符号缺失错误
问题:命令行工具运行时出现dyld缺失符号错误
终端运行编译后的命令行工具TPAutoConnect时出现如下输出:
rwelz@Big-Sur-Mac ~ % TPAutoConnect TPAutoConnect(1963,0x1139b1600) malloc: nano zone abandoned due to inability to preallocate reserved vm space. dyld[1963]: missing symbol called zsh: abort TPAutoConnect
崩溃日志堆栈跟踪:
Termination Reason: Namespace DYLD, Code 4 Symbol missing missing symbol called (terminated at launch; ignore backtrace) Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 dyld 0x11397798e __abort_with_payload + 10 1 dyld 0x11398da72 abort_with_payload_wrapper_internal + 80 2 dyld 0x11398daa4 abort_with_payload + 9 3 dyld 0x11393b699 dyld4::halt(char const*) + 615 4 dyld 0x113958164 dyld4::APIs::_dyld_missing_symbol_abort() + 34 5 TPAutoConnect 0x10ee0056b asan.module_ctor + 11 6 dyld 0x11396c911 invocation function for block in dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&, dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int) block_pointer, void const*) const + 129 7 dyld 0x113963e26 invocation function for block in dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo const&, bool, bool&) block_pointer) const + 557 8 dyld 0x113932db3 dyld3::MachOFile::forEachLoadCommand(Diagnostics&, void (load_command const*, bool&) block_pointer) const + 129 9 dyld 0x113963bb7 dyld3::MachOFile::forEachSection(void (dyld3::MachOFile::SectionInfo const&, bool, bool&) block_pointer) const + 179 10 dyld 0x11396c342 dyld3::MachOAnalyzer::forEachInitializerPointerSection(Diagnostics&, void (unsigned int, unsigned int, unsigned char const*, bool&) block_pointer) const + 118 11 dyld 0x11396c5b4 dyld3::MachOAnalyzer::forEachInitializer(Diagnostics&, dyld3::MachOAnalyzer::VMAddrConverter const&, void (unsigned int) block_pointer, void const*) const + 386 12 dyld 0x113945d82 dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const + 144 13 dyld 0x113945f0e dyld4::Loader::runInitializersBottomUp(dyld4::RuntimeState&, dyld3::Array<dyld4::Loader const*>&) const + 178 14 dyld 0x113945fb2 dyld4::Loader::runInitializersBottomUpPlusUpwardLinks(dyld4::RuntimeState&) const + 108 15 dyld 0x113959826 dyld4::APIs::runAllInitializersForMain() + 222 16 dyld 0x11393738d dyld4::prepare(dyld4::APIs&, dyld3::MachOAnalyzer const*) + 3443 17 dyld 0x1139364e4 start + 388
已尝试的操作:
- 使用
xcodebuild … -enableAddressSanitizer YES编译 - 在Xcode中设置
Other Linker Flags和Other C Flags为-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fsanitize-address - 添加
-shared-libasan链接标志 - 组合使用上述所有标志
关键信息:使用Xcode 12.3在旧系统编译,在macOS 13.4.1上运行该程序。
解决方案
这个问题的核心是跨版本编译时AddressSanitizer(ASan)的兼容性不匹配:
问题根源
Xcode 12.3附带的ASan库与macOS 13.4.1系统中的dyld/运行时不兼容。ASan是和Xcode版本绑定的,旧版本Xcode编译的ASan增强程序,无法在新版本macOS上正常加载所需符号,触发启动时崩溃。修复步骤
- 关闭ASan编译(优先推荐):如果不需要地址 sanitizer 功能,直接移除所有ASan相关编译/链接标志,重新编译程序:
或者在Xcode项目设置中关闭xcodebuild … -enableAddressSanitizer NOEnable Address Sanitizer选项。 - 匹配编译与运行环境:如果必须使用ASan,需要在与目标运行系统(macOS 13.4.1)对应的Xcode版本(如Xcode 14.3及以上)中编译程序,确保ASan库和系统运行时版本兼容。
- 静态链接ASan(不推荐):macOS上ASan通常以动态库形式存在,静态链接可能引发其他兼容性问题,仅作为最后尝试方案。
- 关闭ASan编译(优先推荐):如果不需要地址 sanitizer 功能,直接移除所有ASan相关编译/链接标志,重新编译程序:
额外说明
malloc的nano zone警告是ASan加载失败的伴随现象,解决符号缺失问题后该警告会自动消失。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

