【问题标题】:-fsanitize not using gold linker in GCC-6.1-fsanitize 在 GCC-6.1 中不使用黄金链接器
【发布时间】:2016-10-02 20:42:02
【问题描述】:

更新(2016 年 9 月 30 日)

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 和支持 GLIBCXX_3.4.22 的 libstdc++ 的 Ubuntu 版本。即使在一个简单的“hello world”程序中,指定消毒剂也不会强制使用黄金链接器。

main.cpp

#include <iostream>
int main() {
    std::cout << "Hello, world!\n";
}

编译和链接

g++ -fsanitize=address -c -o main main.cpp
g++ -fsanitize=address -o main main.o

给出错误

/usr/bin/ld: unrecognized option '--push-state'
/usr/bin/ld: use the --help option for usage information
collect2: error: ld returned 1 exit status

这表明-fsanitize 选项没有选择黄金链接器。当然,简单的解决方法是在链接期间使用-fuse-ld=gold,但是以前的 gcc 版本在使用 sanitizers 时不需要这个。例如,这段代码在 gcc-5.3 和 4.9(都是 Ubuntu 版本)下运行良好。其他人对 gcc-6.1 的非 Ubuntu 版本有这个问题吗? 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
--enable-plugin
--with-system-zlib
--disable-browser-plugin
--enable-java-awt=gtk
--enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-amd64/jre
--enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-amd64
--with-arch-directory=amd64
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar
--enable-objc-gc
--enable-multiarch
--disable-werror
--with-arch-32=i686
--with-abi=m64
--with-multilib-list=m32,m64,mx32
--enable-multilib
--with-tune=generic
--enable-checking=release
--build=x86_64-linux-gnu
--host=x86_64-linux-gnu
--target=x86_64-linux-gnu

【问题讨论】:

  • 看起来很像 Ubuntu 软件包中的错误。
  • @BaummitAugen 这就是我的想法,但是用于构建 6.1 和 5.3 的配置选项没有区别,但 5.3 可以正常工作。
  • 我也遇到了同样的问题。无论哪种方式,传递-fuse-ld=gold 都可以明确解决问题。
  • 5.4 也有这个问题。 -fuse-ld=gold 解决了它。谢谢!
  • 在 Ubuntu 14.04 上的 5.4.1 上遇到了同样的问题,-fuse-ld=gold 解决了这个问题。有人提交了错误报告吗?

标签: c++ gcc ld address-sanitizer gold-linker


【解决方案1】:

对我来说同样的问题和相同的解决方案使用

 -fuse-ld=gold

【讨论】:

    猜你喜欢
    • 2015-09-07
    • 2017-08-31
    • 2015-08-17
    • 2016-11-27
    • 2014-03-31
    • 2017-12-12
    • 2017-03-25
    • 2014-07-08
    • 2021-01-01
    相关资源
    最近更新 更多