Uccntu构建的gcc-6.2((Ubuntu 6.2.0-3ubuntu11~16.04)6.2.0 20160901)不再存在这个问题.
我使用了Ubuntu建立GCC-6.1的[1]((Ubuntu的6.1.1-3ubuntu11〜14.04.1)6.1.1 20160511),GNU binutils的2.24,和libstdc ++与GLIBCXX_3.4.22支持.即使在简单的"hello world"程序中,指定清洁剂也不会强制使用黄金链接器.
#include <iostream>
int main() {
std::cout << "Hello, world!\n";
}
Run Code Online (Sandbox Code Playgroud)
编译和链接
g++ -fsanitize=address -c -o main main.cpp
g++ -fsanitize=address -o main main.o
Run Code Online (Sandbox Code Playgroud)
给出了错误
/usr/bin/ld: unrecognized option '--push-state'
/usr/bin/ld: use the --help option for usage information
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
这表示该-fsanitize选项未选择黄金链接器.当然,简单的解决方法是-fuse-ld=gold在链接期间使用,但是在使用消毒剂时,gcc的先前版本不需要这样做.例如,这个代码在gcc-5.3和4.9下完全正常(两者都是Ubuntu版本).是否有其他人在使用非Ubuntu构建的gcc-6.1时遇到此问题?Ubuntu构建是否破损?
[1]使用以下标志构建(gcc-5.3和gcc-4.9的构建只有名称和后缀的差异)
--with-pkgversion='Ubuntu 6.1.1-3ubuntu11~14.04.1'
--with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs
--enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++
--prefix=/usr
--program-suffix=-6
--enable-shared
--enable-linker-build-id
--libexecdir=/usr/lib
--without-included-gettext
--enable-threads=posix
--libdir=/usr/lib
--enable-nls
--with-sysroot=/
--enable-clocale=gnu
--enable-libstdcxx-debug
--enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=gcc4-compatible
--disable-libstdcxx-dual-abi
--enable-gnu-unique-object
--disable-vtable-verify
--enable-libmpx …Run Code Online (Sandbox Code Playgroud)