使用clang为本地主程序与共享库启用ASAN遇符号错误求助
解决ASAN静态链接共享库的符号未定义问题
首先明确:ASAN可以静态链接进共享库,但你的编译配置存在问题,导致SDL2.so找不到ASAN相关符号。下面提供两种可行的解决方案:
方案一:让SDL2.so静态链接ASAN
编译SDL2的每个源文件和链接阶段都要添加完整的ASAN选项:
# 编译单个源文件 clang++ -fsanitize=address -static-libsan -fuse-ld=lld -c src/file.cpp -o obj/file.o # 链接生成共享库 clang++ -shared -fsanitize=address -static-libsan -fuse-ld=lld obj/*.o -o SDL2.so
注意:必须在编译每个目标文件时就加入-fsanitize=address,ASAN是在编译阶段完成代码插桩的,仅在链接阶段添加选项无法给共享库代码插桩。另外确保你的clang版本在9以上,老版本对共享库静态链接ASAN的支持不完善。
方案二:统一使用动态链接ASAN(更省心)
直接移除-static-libsan选项,让主程序和SDL2.so都依赖动态ASAN库:
编译主程序:
clang++ -fsanitize=address -fuse-ld=lld -static-libstdc++ src/*.cpp -o myExecutable
编译SDL2.so:
clang++ -fsanitize=address -fuse-ld=lld -static-libstdc++ -shared obj/*.o -o SDL2.so
这种方式下,运行程序时系统会自动加载动态ASAN库,所有ASAN相关符号都能被正确解析,不会出现找不到的问题。
关键注意点
- 主程序和共享库的ASAN链接方式必须一致:要么都静态链接,要么都动态链接,不能混合。你之前的问题根源就是主程序静态链接了ASAN,但SDL2.so编译时加了ASAN却未正确完成静态链接,导致它依赖的符号在主程序中,但静态链接的ASAN符号是局部的,共享库无法访问。
- 编译共享库时,每个源文件都要添加
-fsanitize=address,ASAN插桩是编译阶段的操作,仅在链接阶段加选项不会给共享库代码插桩。
内容的提问来源于stack exchange,提问作者GGinside
相关产品推荐
相关产品推荐

