2

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

4

2 回答 2

2

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

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

于 2016-10-28T12:21:07.593 回答
1

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

试试看LD_PRELOAD,如果这对你来说是可行的。

于 2016-09-03T16:51:53.950 回答