如何解决' __ tls_get_addr @@ GLIBC_2.3'编译GCC本身有错误吗?

时间:2015-01-28 17:48:21

标签: gcc compilation glibc

背景信息:客户端有一组遗留的SuSE服务器,需要glibc更新来修补“Ghost”漏洞。这些机器从未更新过,并且从2005年开始运行旧版本的gcc和glibc。尝试编译当前的glibc会产生错误,需要更新的gcc,所以我试图升级gcc。

问题: gcc的make有很长的路要走,它失败并出现以下错误(短版本 - 更长版本更进一步发布):

undefined reference to symbol '__tls_get_addr@@GLIBC_2.3'
/lib64/ld-linux-x86-64.so.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

已经尝试过研究和调查:

从谷歌搜索我知道这是一个链接器问题。 gcc基础设施系统(包括ld)已成功升级到binutils-2.25

我已尝试在Makefile中将LDFLAGS =更改为LDFLAGS = -lz,建议将其修复为影响Oracle安装的类似问题,但这没有任何区别。

我尝试安装稍旧的gcc(4.8而不是4.92),在同一个地方出现相同的错误。

不幸的是,尝试搜索与编译gcc本身相关的问题往往会产生大量关于使用gcc编译其他内容的结果,使搜索变得困难。

详细背景和错误消息:

安装gcc有很多先决条件,在我开始安装之前我必须升级gmp,mpfr和mpc。 Gmp和mpfr安装成功,但只有通过将--disable-shared添加到./configure命令才可以编译mpc。

已安装内容的完整列表:

binutils-2.25, gmp-4.3.2, mpfr-2.4.2, mpc-0.8.1

配置命令(根据gcc团队的建议从相邻的构建目录运行):

../gcc-4.9.2/configure --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local

完整的错误消息:

  

make [3]:进入目录/usr/local/src/gcc-4.9.2-build/gcc' /usr/local/src/gcc-4.9.2-build/./prev-gcc/xg++ -B/usr/local/src/gcc-4.9.2-build/./prev-gcc/ -B/usr/local/x86_64-unknown-linux-gnu/bin/ -nostdinc++ -B/usr/local/src/gcc-4.9.2-build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs -B/usr/local/src/gcc-4.9.2-build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/libsupc++/.libs -I/usr/local/src/gcc-4.9.2-build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/include/x86_64-unknown-linux-gnu -I/usr/local/src/gcc-4.9.2-build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/include -I/usr/local/src/gcc-4.9.2/libstdc++-v3/libsupc++ -L/usr/local/src/gcc-4.9.2-build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs -L/usr/local/src/gcc-4.9.2-build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/libsupc++/.libs -g -O2 -gtoggle -DIN_GCC -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -static-libstdc++ -static-libgcc -o cc1 c/c-lang.o c-family/stub-objc.o attribs.o c/c-errors.o c/c-decl.o c/c-typeck.o c/c-convert.o c/c-aux-info.o c/c-objc-common.o c/c-parser.o c/c-array-notation.o c-family/c-common.o c-family/c-cppbuiltin.o c-family/c-dump.o c-family/c-format.o c-family/c-gimplify.o c-family/c-lex.o c-family/c-omp.o c-family/c-opts.o c-family/c-pch.o c-family/c-ppoutput.o c-family/c-pragma.o c-family/c-pretty-print.o c-family/c-semantics.o c-family/c-ada-spec.o c-family/c-cilkplus.o c-family/array-notation-common.o c-family/cilk.o c-family/c-ubsan.o i386-c.o glibc-c.o \ cc1-checksum.o libbackend.a main.o libcommon-target.a libcommon.a ../libcpp/libcpp.a ../libdecnumber/libdecnumber.a libcommon.a ../libcpp/libcpp.a
../libbacktrace/.libs/libbacktrace.a ../libiberty/libiberty.a ../libdecnumber/libdecnumber.a -L/usr/local/lib -L/usr/local/lib -L/usr/local/lib -lmpc -lmpfr -lgmp -rdynamic -ldl -L../zlib -lz /usr/local/x86_64-unknown-linux-gnu/bin/ld: /usr/local/src/gcc-4.9.2-build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.a(eh_globals.o): undefined reference to symbol '__tls_get_addr@@GLIBC_2.3' /lib64/ld-linux-x86-64.so.2: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status make[3]: *** [cc1] Error 1 make[3]: Leaving directory
/ usr / local / src / gcc-4.9.2-build / gcc'make [2]: * [all-stage2-gcc]   错误2 make [2]:离开目录/usr/local/src/gcc-4.9.2-build' make[1]: *** [stage2-bubble] Error 2 make[1]: Leaving directory / usr / local / src / gcc-4.9.2-build'make:* [all]错误2

3 个答案:

答案 0 :(得分:0)

从源代码构建QT5.3或更高版本的QT版本时遇到了同样的问题。

我的系统背景:

操作系统: Linux iaschn 2.6.9-89.0.25.ELsmp#1 SMP Thu 5月6日12:33:40 EDT 2010 x86_64 x86_64 x86_64 GNU / Linux

gcc: 使用内置规格。 COLLECT_GCC =。/ GCC COLLECT_LTO_WRAPPER = /快速/ rapid_tools / REL_4.7 / x86_64的/ GCC-5.3.0 /的libexec / GCC / x86_64的未知-Linux的GNU / 5.3.0 / LTO-包装 目标:x86_64-unknown-linux-gnu 配置为:../../ src / gcc-5.3.0 / configure CC = gcc4 CXX = g ++ 4 --enable-languages = c,c ++ --prefix = / rapid / rapid_tools / REL_4.7 / x86_64 /gcc-5.3.0 线程模型:posix gcc版本5.3.0(GCC)

binutils是: GNU ld版本2.26.20160125 版权所有(C)2015 Free Software Foundation,Inc。 这个程序是免费软件;你可以根据条款重新分配 GNU通用公共许可证版本3或(根据您的选择)更高版本。 该计划绝对没有保修。

虽然,我一直在努力解决这个问题很长一段时间,搜索谷歌上的信息和谷歌说:在命令行末尾手动添加动态链接:

-L/lib64 -l:ld-linux-x86-64.so.2

它通过了上述问题,而编译后的二进制文件根本没有用。

我后来检查了QT5.3或更高版本的最低要求。检查出glibc需要大于2.8.3,所以,我知道你可能在glibc上遇到同样的问题。

所以,解决方案可能是:

upgrade glibc

答案 1 :(得分:0)

在Centos 4.9计算机上将binutils升级到2.26后,我遇到了类似的问题。较新的链接器需要包含/lib64/ld-linux-x86-64.so.2,但它们需要包含在DSO列表获胜选项的末尾--as-needed

要做到正确,请通过编译器调用链接器并添加粗体后面的内容 /usr/lib64/libc.so

/ * GNU ld脚本    使用共享库,但某些功能仅在    静态库,所以继续尝试。 * / OUTPUT_FORMAT(ELF64-的x86-64) GROUP(/lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED(/lib64/ld-linux-x86-64.so.2))

这对我有用

答案 2 :(得分:0)

我遇到了在Cray xc40 / 50系统上构建代码的类似问题。我的问题是,由于Cray必须从默认值中更改每一个东西,您必须将额外的标志传递给编译器包装器。 (对于C,C ++和Fortran,编译器包装器是cc,CC和ftn。)需要传递的标志,-dynamic记录在包装器的手册页中。您可以告诉底层编译器静态或动态链接,但不将此标志传递给包装器,这是运气不好。