3

为了能够调试和模糊整个 Linux 发行版,我想将 ASAN(AddressSanitizer,https: //en.wikipedia.org/wiki/AddressSanitizer )设置为 gcc 的默认选项。所以通常要达到我想要的,一般我在编译一个linux包之前设置以下变量:

CFLAGS="-fsanitize=address,undefined -Wformat -Werror=format-security -Werror=array-bounds -g" 
CXXFLAGS="-fsanitize=address,undefined -Wformat -Werror=format-security -Werror=array-bounds -g" 
LDFLAGS="-fsanitize=address,undefined"

并尝试编译并运行我的代码。我想让它默认为 gcc。

一种选择是使用规范文件:https ://gcc.gnu.org/onlinedocs/gcc/Spec-Files.html 。但是我没有找到一种方法来设置“捕获所有规则”来编译和链接我所有的 c/c++ 代码与 AddressSanitizer。

我的问题是:

  • 任何示例如何使用规范文件来做到这一点?
  • 这是最好的方法吗?
  • 还有其他替代方法吗?
4

1 回答 1

2

首先,请务必查看Tizen(也在此处)和Gentoo中现有的全发行版 Asan 支持。

一般来说,主要有两种方法:

  • 自定义构建系统以默认启用 Asan,通常使用CFLAGSand CXXFLAGS;这并不总是有效,因为许多软件包都忽略了它们(我认为这就是 Hanno Boeck 在 Gentoo 中所做的)
  • 用包装器替换/usr/bin/gcc,/usr/bin/g++/usr/bin/cc( 并且可能x86_64-linux-gnu-gcc, x86_64-linux-gnu-g++) 将添加 Asan 标志并将调用重定向到原始可执行文件(这是我们最终在 Tizen 中采用的方法,发现它非常成功)

作为旁注,我建议添加以下选项

CFLAGS += -fsanitize-recover=address,undefined

否则启动将在太早的阶段失败。另请查看上面链接中的建议设置ASAN_OPTIONS,人们花了很长时间才弄清楚。

于 2017-02-18T09:27:23.420 回答