Clang AddressSanitizer编译报错:undefined symbol: __asan_option_detect_stack_use_after_return
解决Clang AddressSanitizer编译时
__asan_option_detect_stack_use_after_return未定义错误 问题描述
我尝试用Clang 3.8.0的AddressSanitizer编译C++代码,希望将Sanitize结果输出到核心转储中,因此添加了-fsanitize=address编译选项。最终使用的完整编译命令如下:
/opt/llvm-3.8.0/bin/clang++ \ --gcc-toolchain=/opt/gcc-5.2.0 -fsanitize=address -DLINUX \ -DLINUX64 -DTB_USE_RCU -DURCU_INLINE_SMALL_FUNCTIONS \ -DU_USING_ICU_NAMESPACE=0 -DNDEBUG -D_POSIX_PTHREAD_SEMANTICS \ -fPIC -D_GNU_SOURCE -DTB_USE_RCU -DTB_USE_RCU \ -D_GLIBCXX_USE_CXX11_ABI=0 -m64 --gcc-toolchain=/opt/gcc-5.2.0 \ -flto=full -std=gnu++14 -D_GLIBCXX_DEPRECATED= -pipe \ -fno-omit-frame-pointer -ffast-math -fno-finite-math-only \ -pthread -march=core2 -mtune=corei7 -g -O3 -Qunused-arguments \ -fnon-call-exceptions -fvisibility=hidden \ -fvisibility-inlines-hidden -Wall -Wextra -Wshadow \ -Wpointer-arith -Wno-self-assign -Wno-unused-function \ -Wno-gnu-empty-initializer -Wno-unused-parameter \ -Wno-ignored-qualifiers -Wno-mismatched-tags \ -Wno-unused-local-typedef -Wno-parentheses-equality \ -Wno-unused-private-field -Wno-missing-field-initializers \ -Wno-missing-braces -Werror=return-type \ -Werror=overloaded-virtual -c MyClass.cpp -o MyClass.o
但编译时遇到了如下错误:
undefined symbol: __asan_option_detect_stack_use_after_return
请问最简单的解决方法是什么?
解决方法
这个错误的核心原因是Clang 3.8版本中,链接时优化(LTO)与AddressSanitizer的兼容性存在缺陷——你使用了-flto=full选项,而ASan需要在编译和链接阶段保持一致的插桩逻辑,LTO的跨模块优化会破坏这种一致性,导致ASan相关的符号无法正确解析。
最简单的快速修复方案就是:
- 移除编译命令中的
-flto=full选项
去掉这个选项后,重新编译就能避免该符号未定义的问题,同时不影响AddressSanitizer的正常工作。
如果你确实需要保留LTO功能,另一个可行方案是升级Clang到4.0及以上版本——后续版本的LLVM对ASan和LTO的兼容性做了大幅改进,能更好地支持两者同时使用。
另外还要注意:后续链接可执行文件时,也需要确保添加-fsanitize=address选项,否则可能出现其他ASan相关的符号错误。
内容的提问来源于stack exchange,提问作者intrigued_66
相关产品推荐
相关产品推荐

