Python原生模块中的清洁剂

时间:2016-08-15 14:34:05

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

我想将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.

现在这看起来像静态标志不起作用。 是否可以仅将清洁剂用于共享对象,或者是否需要将清洁剂直接链接到python3?

2 个答案:

答案 0 :(得分:2)

由于某些原因,-lasan中的链接也无效。但是,LD_PRELOAD工作正常。

如果可行,请尝试LD_PRELOAD

答案 1 :(得分:2)

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

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