【问题标题】:How to enable address sanitizer for multiple C++ binaries如何为多个 C++ 二进制文件启用地址清理程序
【发布时间】:2017-10-30 17:53:51
【问题描述】:

我正在开发一种产品,该产品由多个相互依赖的 C++ 可执行文件和库组成。我正在使用 GCC 和 -fsanitize-address 构建它们。 据我了解,如果我想将地址清理程序与库一起使用,我必须将其构建为共享对象(这是 GCC 的默认选项)。因此,我认为最好的选择是使用-static-libasan 为可执行文件静态构建地址清理程序,并为库动态构建它。但是,当我这样做时,在构建 C++ 可执行文件之一时出现链接错误:

==10823==Your application is linked against incompatible ASan runtimes

这让我觉得地址清理器的静态和动态版本不能与 GCC 混合,对吗?我在 sanitizers GitHub 页面上找不到任何相关信息。

【问题讨论】:

  • 这不是 ASAN 特有的,您永远不会对任何库执行刚才描述的操作。要么只使用共享版本(用于库和可执行文件或仅用于后者),要么只使用静态版本(仅用于可执行文件)。

标签: gcc address-sanitizer


【解决方案1】:

TLDR:

  • 如果您使用 GCC/Clang 并且对主要可执行文件和 shlib 进行了清理,则无需执行任何特殊操作 - 只需使用默认 -fsanitize=address
  • 如果您使用 GCC 并且仅清理 shlib,请再次继续使用 -fsanitize=address 并在运行应用程序时另外导出 LD_PRELOAD=$(gcc -print-file-name=libasan.so)
  • 如果您使用 Clang 并且仅清理 shlib,请使用 -fsanitize-address -shared-libasan 编译/链接,并在运行应用程序时另外导出 LD_PRELOAD=$(clang -print-file-name=libclang_rt.asan-x86_64.so)

现在做一些解释。最初 Asan 仅存在于 Clang 中,默认情况下使用(并且仍然使用)-static-libasan。当它被移植到 GCC 时,GCC 开发人员决定首选共享运行时(例如,因为它允许一个人只清理一个共享库并保持主要可执行文件未经清理,例如清理 Python 模块而不重新编译 python.exe,请参阅wiki 其他示例) .这两种方法都是二进制不兼容的,因此您不能将应用程序的一部分与静态运行时链接,而将部分与动态运行时链接。

大概

  • GCCs -fsanitize=address 等同于 Clangs -fsanitize=address -shared-libasan(而 -shared-libasan 在 Clang 中是二等公民,因此不太受支持)
  • Clangs -fsanitize=address 等同于 GCCs -fsanitize=address -static-libasan(同样,-static-libasan 在 GCC 中是二等公民,所以也有一些 issues

附带说明,有关其他 GCC/Clang Asan 差异,请参阅 this helpful wiki

【讨论】:

  • 知道了,因为this issue,我正在尝试使用 GCC 静态编译地址清理程序。
  • LD_PRELOAD 应该不是必需的,-fsanitize=address 在创建库时将 libasan.so.* 添加为 NEEDED,除非您明确告诉它不要这样做。
  • @MarcGlisse 是的,但它不会拦截标准符号,因为它不是库列表中的第一个。另外我依稀记得还有其他重要的问题,所以目前Asan会abort execution if LD_PRELOAD is missing
  • @yugr 谢谢,这是有用的信息。我认为作为第一个依赖项的第一个依赖项就足够了(多了一个间接),但显然不是。
  • @Perennialista 请注意,您可以在 GCC 中使用 -static-libasan,只要您的主要可执行文件经过清理(只需将其附加到 CFLAGS 即可用于可执行文件和 shlib)。但要小心this issue
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2022-11-02
相关资源
最近更新 更多