为了能够调试和模糊整个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。
我的问题是:
答案 0 :(得分:2)
首先,请务必查看Tizen(还有here)和Gentoo中现有的整个发行版Asan enablings。
一般来说,有两种主要方法:
CFLAGS
和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
,花了很长时间才弄清楚它们。