Gcc AddressSanitizer:我们怎么知道C中的对象文件/可执行文件是用AddressSanitizer编译的?

Gcc AddressSanitizer:我们怎么知道C中的对象文件/可执行文件是用AddressSanitizer编译的?,gcc,gnu-make,address-sanitizer,Gcc,Gnu Make,Address Sanitizer,我们计划将AddressSanitizer工具集成到我们的构建基础架构中 为此,我正在处理GNUmake文件,以编译所有带有AddressSanitizer添加标志:-fsanize=address的C代码。现在,我想验证创建的对象文件或可执行文件是否使用 不管有没有消毒剂 我有什么办法可以证实这一点吗 我只是想运行nm | grep asan:- 它给出了以下未定义的参考符号 U __asan_init U __asan_option_detect_stack_use_af

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

为此,我正在处理GNUmake文件,以编译所有带有AddressSanitizer添加标志:-fsanize=address的C代码。现在,我想验证创建的对象文件或可执行文件是否使用 不管有没有消毒剂

我有什么办法可以证实这一点吗

我只是想运行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的方法是否正确。用-fsanize=address编译代码可以吗?或者我仍然需要在这里做一些事情来成功使用AddressSanitizer


请帮我做这件事。提前感谢。

在检查目标文件时,符号表中的Asan报告通常可以作为Asan函数的参考。对于链接的可执行文件,除了使用GCC和-static libasan-s链接外,它在大多数情况下都可以工作。

只需使用-fsanize=address编译代码就可以了吗?您需要编译-c并使用此标志链接。yugr,是的,对于链接,我也使用该标志,但在链接的同时,我还需要使用asan库,对吗?i、 e-L/test/common/pkg/gcc/v4.8.0/lib-lasanNo,-fsanize=address将为您添加这些标志。如果我们不通过-L/test/链接-拉桑,符号会像我说的那样被清除,对吗?仅使用-fsanize=address标志而不使用-lasan library是使用地址消毒器的正确方法?在GCC上,最终可执行文件中未定义的符号是预期的,因为它们将在启动时从libasan导入。因此,如果使用Clang,它们将被定义,因为它静态链接libclangrt_asan。