【问题标题】:Sanitizers in Python native modulePython 本机模块中的消毒剂
【发布时间】:2016-08-15 14:34:05
【问题描述】:

我想将 GCC 的消毒剂用于本机模块。

我使用链接选项:

-static-libasan -static-libtsan -static-liblsan -static-libubsan -fsanitize=address -lasan -lubsan

当我加载本机模块时,它会打印错误消息:

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.

现在这似乎静态标志不起作用。 是否可以仅对共享对象使用 sanitizer,还是必须将 sanitizer 直接链接到 python3?

【问题讨论】:

标签: python python-3.x gcc address-sanitizer


【解决方案1】:

问题可能是由-static-libasan 标志引起的,它告诉编译器libasan.a 将由主可执行文件链接,因此无需将其链接到插件。如果您对血腥细节感兴趣,请参阅wiki。一般来说,要清理大型应用程序的单个模块,您应该编译并使用-fsanitize=address 链接它,然后使用LD_PRELOADed libasan.so 运行应用程序(需要LD_PRELOAD 以确保 libasan 能够拦截所有必要的一些 glibc)。

注意清理单个模块可能会错过主可执行文件中发生的内存错误,即使它们是由来自模块的错误 API 调用引起的。要检测这些,您还需要清理可执行文件。

【讨论】:

    【解决方案2】:

    由于某种原因,-lasan 中的链接也不起作用。但是,LD_PRELOAD 工作正常。

    试试LD_PRELOAD,如果这对你可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 2021-01-23
      相关资源
      最近更新 更多