我有几个版本的项目签出和编译。如果我发现错误,我会比较版本以缩小问题范围。有时我启用像AddressSanitizer这样的清洁剂。如果我重新使用可执行文件,我不记得它是否是使用清洁剂编译的。如果可执行文件工作正常,我不确定该错误是否存在,或者我是否在此版本中未包含清理程序。所以我必须重新配置和重建,以确保我有清洁剂。
有没有办法检查是否已使用清理程序编译可执行文件?
答案 0 :(得分:2)
您需要使用__has_feature(address_sanitizer),请参阅http://clang.llvm.org/docs/AddressSanitizer.html(与其他清洁剂相同)。
答案 1 :(得分:2)
地址清理程序也可以使用GCC中的-static-libasan
选项静态编译。静态编译地址清理程序是Clang中的默认模式。
如果您静态编译地址清理程序,则显然无法使用ldd
来验证您的二进制文件是否已清理。在这种情况下,我使用nm
并检查二进制文件中是否有清洁剂符号:
nm -an <executable> | grep asan
答案 2 :(得分:1)
来自man ldd
:
ldd打印命令行中指定的每个程序或共享库所需的共享库。
只要地址消毒剂需要与libasan.so库(清洁剂的实际实施)链接,您可以假设:
如果ldd
无法打印共享库libasan.so
,则肯定意味着地址清理程序已关闭。
如果ldd
将打印共享库libasan.so
,则表示您的链接器标志包含-lasan
,否则在链接期间您将得到未解析的符号错误。除非您在构建系统时遇到错误,否则很可能启用了地址清理程序。
如果您的建筑系统存在错误,请选择第三个选项。 ldd
将打印libasan.so
,但如果您转到链接器-lasan
但未通过-fsanitize=address
,则会关闭地址清理程序。这意味着您将可执行文件与地址清理程序相关联,但不包括对可执行文件的检查。
或者您可以执行objdump -p以查看dymanic部分中是否需要libasan.so
:NEEDED libasan.so.0
。 objdump
可以提供与ldd
相同(或更多)的信息。