AddressSanitizer:我们如何知道 C 中的对象 file/executable 是使用 AddressSanitizer 编译的?

AddressSanitizer: How could we know that object file/executable in C is compiled with AddressSanitizer?

我们计划将 AddressSanitizer 工具集成到我们的构建基础架构中。

为此,我正在处理我们的 GNUmake 文件,以使用 AddressSanitizer(添加标志 :-fsanitize=address)编译我所有的 C 代码。现在我想验证创建的目标文件或可执行文件是否是用编译的 AddressSanitizer 与否。

有什么方法可以验证吗

我只是想 运行 nm | grep asan :-

它给出了以下未定义的参考符号。

     U __asan_init
     U __asan_option_detect_stack_use_after_return
     U __asan_register_globals
     U __asan_report_load1
     U __asan_report_load4
     U __asan_stack_malloc_1
     U __asan_unregister_globals

我不确定这种检查方式是否正确。它显示未定义的引用,如上。我不确定我是否在我们的构建系统中以正确的方式集成了 AddressSanitizer。只用 (-fsanitize=address) 编译代码可以吗?或者我仍然需要在这里做一些事情才能成功使用 AddressSanitizer。

请帮帮我。提前致谢。

在检查目标文件时,Grepping 符号 table 中的 Asan 函数(通常是 __asan_report_)的引用很好。对于 linked executables,它在大多数情况下也有效(除非你 link 使用 GCC 和 -static-libasan -s)。