【问题标题】:Asan : Issue with asan library loadingAsan : asan 库加载问题
【发布时间】:2020-01-22 06:21:32
【问题描述】:

在我们的构建系统中,我们最近将 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,但仍然面临同样的问题。

不知道这里出了什么问题。我该如何解决这个问题?

有什么想法吗?谢谢和问候!

【问题讨论】:

  • 主要可执行文件是否也被清理或仅共享库?
  • @yugr,可执行文件,我正在运行并遇到未清理的问题。基于错误,我在我的一个环境文件中设置了指向 libasan.so 路径的 LD_PRELOAD,其中还设置了 LD_LIBRARY_PATH。
  • 请提供MVCE
  • 基于文档中的信息:github.com/google/sanitizers/issues/679 有人提到:FWIW 非空 /etc/ld.so.preload 是 GCC 6 不起作用的确切原因(确实是 ASan 运行时不是最初的库列表中的第一个)。 GCC 4.9 之所以有效,是因为它太旧并且没有这种健全性检查。我正在使用 gcc 6.3,我看不到文件文件 /etc/ld.so.preload

标签: gcc gnu-make address-sanitizer


【解决方案1】:

你有几种方法可以解决这个问题:

  • 使用-fsanitize=address 构建主可执行文件
  • 在您的测试机器上删除/etc/ld.so.preload
  • 使用export ASAN_OPTIONS=verify_asan_link_order=0禁用检查(需要最近的GCC);但您必须确保来自 /etc/ld.so.preload 的库不会拦截对 Asan 很重要的符号,例如malloc、free 等,否则事情会开始崩溃

【讨论】:

  • 我们尝试在我的构建(使用 asan)上运行一些测试的“xrun”可执行文件中的主要可执行文件?第二个。我在我的机器上看到了 ld.so.preload。我不能做'ls'。该文件不可用。
  • @santosh 主要可执行文件是链接到已清理库 (libspd.so) 的文件。 “我在我的机器上看到 ld.so.preload” - 这与您的评论“非空 /etc/ld.so.preload 是 GCC 6 不起作用的确切原因”相矛盾。
  • @santosh 我真的建议您在问题文本中提供 MVCE 或至少完整描述您的步骤。否则很难提供帮助,因为需要进行太多猜测。
  • 文件 '/etc/ld.so.preload' 它本身不在我运行构建的主机中。
  • @santosh 那么你为什么提到有问题的/etc/ld.so.preload,说这是“GCC 6 不起作用的确切原因”?请注意,所有这些无休止的讨论都是由于原始问题中提供的详细信息不足。
猜你喜欢
  • 2020-05-26
  • 2020-01-04
  • 2021-07-02
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
相关资源
最近更新 更多