我试图在一些较旧的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版本的要求吗?
我试图在一些较旧的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版本的要求吗?
一个未经测试的可能方案
"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} .... ^^^^^^^^^^^^^^^^ ...
了解更多信息,请点击这里。
-Wl,
选项的参数只是传递给链接器 - 你是使用gcc
进行链接还是直接调用ld
或其他链接器?此外,请注意-Wl,--hash-style = both
选项中不能有空格。 - Michael Burr-Wl,--hash-style=both
,解决了我的问题。谢谢。 - Fallenreaper-Wl,--hash-style=both
(-Wl,
和--hash-style=both
之间没有空格) - user1438233我曾经遇到相同的问题,尝试为一台没有编译器的旧机器编译一个我自己写的小工具。我在更新的机器上进行了编译,但是生成的二进制文件至少需要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的依赖神奇地消失了。
很抱歉我无法解释为什么它起作用,或者为什么在修改之前它没有起作用。
希望这有所帮助!