gcc:降低所需的libc版本

21

我试图在一些较旧的32位RedHat发行版上运行一个新编译的二进制文件。

这个二进制文件是使用C编译的(不是C++),在运行libc v2.12的CentOS 32位虚拟机上编译而成。

RedHat抱怨libc版本过低:

error while loading shared libraries: requires glibc 2.5 or later dynamic linker

由于我的程序相当简单,很可能没有使用libc中的任何新特性。

有办法降低对libc版本的要求吗?


1
这个答案可能会有所帮助 https://dev59.com/3XE85IYBdhLWcg3wShWf - user1202136
3个回答

25

一个未经测试的可能方案

"error while loading shared libraries: requires glibc 2.5 or later dynamic linker"是什么意思?

出现此错误的原因是你想要运行的动态二进制文件(或其相关联的共享库文件)只有.gnu.hash段,但目标机器上的ld.so版本过旧,无法识别.gnu.hash,它只能识别老式的.hash段。

这通常发生在使用更新版本的GCC编译的动态二进制文件时。解决方案是使用以下选项之一重新编译代码:-static编译器命令行选项(创建静态二进制文件),或者以下选项:

-Wl,--hash-style=both

这告诉链接编辑器ld创建.gnu.hash和.hash两个部分。

根据这里的ld文档,旧式的.hash部分是默认值,但编译器可以覆盖它。例如,在RHEL(Red Hat Enterprise Linux)Server release 5.5上版本为4.1.2的GCC有这条线:

$ gcc -dumpspecs
....
*link:
%{!static:--eh-frame-hdr} %{!m32:-m elf_x86_64} %{m32:-m elf_i386} --hash-style=gnu   %{shared:-shared}   ....
                                                                   ^^^^^^^^^^^^^^^^
...

了解更多信息,请点击这里


1
@AknownImous:你遇到了什么错误?-Wl,选项的参数只是传递给链接器 - 你是使用gcc进行链接还是直接调用ld或其他链接器?此外,请注意-Wl,--hash-style = both选项中不能有空格。 - Michael Burr
gcc 抱怨“未识别的命令行选项 -Wl”。我只使用 gcc。 - MonoThreaded
1
2017年,这对我也起作用了。我的网站托管公司的Web服务器似乎是Centos,在Debian上编译的C二进制文件可以正常运行,但在Fedora 17上重新构建的二进制文件却无法运行。根据这个答案,使用“readelf -a”比较新旧版本。果然,在“Section Headers:”和其他地方,新版本有“[4] .gnu.hash GNU_HASH 08048”...而旧版本有“[3] .hash HASH 08048128”...所以我在gcc链接行中添加了标志“-Wl,--hash-style=sysv”,一切都很好。 - Stephen Hewitt
我使用了这个命令-Wl,--hash-style=both,解决了我的问题。谢谢。 - Fallenreaper
大家注意了,这是:-Wl,--hash-style=both-Wl,--hash-style=both之间没有空格) - user1438233
显示剩余3条评论

5

我曾经遇到相同的问题,尝试为一台没有编译器的旧机器编译一个我自己写的小工具。我在更新的机器上进行了编译,但是生成的二进制文件至少需要GLIBC 2.14 才能运行。

通过使用xxd对二进制文件进行转储,我发现了以下信息:

....
5f64 736f 5f68 616e 646c 6500 6d65 6d63  _dso_handle.memc
7079 4040 474c 4942 435f 322e 3134 005f  py@@GLIBC_2.14._
....

所以我用自己写的memcpy替换了代码中的memcpy调用,然后与glibc 2.14的依赖神奇地消失了。

很抱歉我无法解释为什么它起作用,或者为什么在修改之前它没有起作用。

希望这有所帮助!


1
不错的发现,但重写stdlib有点可怕! - MonoThreaded
是的,我同意,但在这种情况下,我的代码非常小,在我的代码中只调用了3次memcpy。 - phsym

3
好的,那么我尝试在优雅和野蛮之间找到平衡,下载了与目标内核版本匹配的虚拟机,从而解决了库问题。整个过程(下载+ yum安装gcc)不到30分钟。
参考资料:虚拟机内核版本映射表

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接