gcc - Asan : asan 库加载问题
问题描述
在我们的构建系统中,我们最近将 ASAN 工具(添加 -fsanitize=address)集成到 CFLAGS 以及在链接时创建库 .so 文件。注意:- 我们使用的是 GCC 6.3 编译器。
我们能够成功地构建我们的代码。但是在运行时失败并出现以下问题:
==52215==ASan runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD.
这是我的 gcc 命令:-
/local/common/pkgs/gcc/v6.3.0/bin/gcc -m32 -shared -o /local/testing/build/new_tool/asan_build/syn/verilog/libspd.so -Wl,-rpath=\$ORIGIN/lib -Wl,-rpath=\$ORIGIN/../lib -W1,-rpath=/local/common/gcc/v6.3.0/lib -fsanitize=address -L/local/testing/build/new_tool/asan_build/modules /local/testing/build/new_tool/asan_build/modules/silvpi.o /local/testing/build/new_tool/asan_build/modules/sypsv.o /local/testing/build/new_tool/asan_build/modules/cdnsv_tfs.o /local/testing/build/new_tool/asan_build/modules/libcore.o /local/testing/build/new_tool/asan_build/modules/vpi_user.o /local/testing/build/new_tool/asan_build/modules/libdenbase.a /local/testing/build/new_tool/asan_build/modules/libbdd.a -L/local/testing/build/new_tool/asan_build/syn/lib -L/local/testing/build/new_tool/asan_build/modules -L/home/local/outer/Linux/lib /local/testing/build/new_tool/asan_build/modules/vhpimodelfunc.o /local/testing/build/new_tool/asan_build/modules/vipcommonlib.a -lm -lc -ldenbase -lbdd -ldenbase -lviputil -llocalCommonMT_sh
我能够libspd.so
成功构建库。但是当我们尝试运行它时,它会因我提到的上述错误而失败。
我可以看到依赖库列表libspd.so
ldd /local/testing/build/new_tool/asan_build/syn/verilog/libspd.so
linux-gate.so.1 => (0x00279000)
libasan.so.3 => /local/pkgs/gcc/v6.3.0/lib/libasan.so.3 (0xf7175000)
libm.so.6 => /lib/libm.so.6 (0x0014e000)
libc.so.6 => /lib/libc.so.6 (0xf6f83000)
libcdsCommonMT_sh.so => /local/testing/build/new_tool/asan_build/verilog/../lib/liblocalCommonMT_sh.so (0x00178000)
libdl.so.2 => /lib/libdl.so.2 (0x00197000)
我们正在尝试使用“xrun”运行我们的应用程序,它在我使用 asan 构建的构建之上运行模拟。正如错误所说:you should either link runtime to your application
我试图将完整的 asan 库路径添加到 LD_LIBRARY_PATH,仍然面临同样的问题。
不知道这里出了什么问题。我该如何解决这个问题?
任何想法?谢谢并恭祝安康!
解决方案
您有几种方法可以解决此问题:
- 构建主要可执行文件
-fsanitize=address
- 摆脱
/etc/ld.so.preload
你的测试机器 export ASAN_OPTIONS=verify_asan_link_order=0
用;禁用检查(需要最近的 GCC)但是您必须确保来自的库/etc/ld.so.preload
不会拦截对 Asan 重要的符号,例如 malloc、free 等,否则事情将开始中断
推荐阅读
- android - 最后一次出现在聊天应用程序中的替代实现
- go - GCP:Go 中的存储桶创建
- r - 如何在 Kaggle 中运行 R 脚本文件
- sqlite - 在 Windows 上打包应用程序后的 Electron 和 sqlite3 问题
- python - selenium.common.exceptions.NoSuchElementException:消息:无法找到元素:instagram bot
- c# - 如何获取可用分析器的列表?
- python - 运行 HelloWorld 的 Pycharm 上的 UnicodeEncodeError
- sql - 加入时如何添加多个列?
- javascript - for 循环和 for..of 循环有什么区别?
- c - cs50 pset4 反映图片滤镜代码问题