如何在较新的Linux中运行需要较旧的glibc库的二进制文件?

时间:2014-05-11 14:32:59

标签: linux static-libraries static-linking

我有一个为旧版Linux构建的二进制文件,当我将二进制文件放入较新的Linux并尝试运行它时,它会告诉“没有这样的文件或目录”#34;错误。

我搜索并发现这是关于不正确的库链接。我在这个二进制文件上使用了ldd,显示的输出是这样的:

./test.exe: /lib/libpthread.so.0: version 'GLIBC_2.1' not found (required by ./test.exe) ./test.exe: /lib/libpthread.so.0: version 'GLIBC_2.0' not found (required by ./test.exe) ./test.exe: /lib/libpthread.so.0: version 'GLIBC_2.3.2' not found (required by ./test.exe) ./test.exe: /lib/libc.so.6: version 'GLIBC_2.1.3' not found (required by ./test.exe) ./test.exe: /lib/libc.so.6: version 'GLIBC_2.1' not found (required by ./test.exe) ./test.exe: /lib/libc.so.6: version 'GLIBC_2.0' not found (required by ./test.exe) libpthread.so.0 => /lib/libpthread.so.0 (0x40004000) libstdc++.so.5 => not found libm.so.6 => /lib/libm.so.6 (0x40025000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x400cd000) libc.so.6 => /lib/libc.so.6 (0x400e1000) /lib/ld-linux.so.2 => /lib/ld-linux.so.3 (0x2a000000) 我确实尝试使用-static编译二进制文件以尝试将所需的库嵌入到二进制文件中(如果我理解-static选项正确),但结果没有改变。我不熟悉编译链接的东西。谁能提供一些如何解决这个问题的帮助?谢谢!

我想做的就是让这个二进制文件在较新版本的Linux上运行,我还搜索了一些解决方案,这些解决方案建议将旧库复制到某个文件夹并使用"包装器"强制这个二进制文件使用该文件夹中的库,但仍然没有幸运。

更新:

我正在为ARM linux做这件事。我没有提到它,因为我没有意识到这很重要。

然而,这两个Linux版本来自同一家公司,他们将其命名为ts-linux。我们从他们那里购买了ARM板,他们还提供了几个Linux版本供客户使用。

基于这个事实,我认为两个linux不应该像GLIBC和uClibc那样不同。我试图将旧库复制到新系统并将LD_LIBRARY_PATH设置为旧库,但是所有系统命令都没有功能,例如,

ts7800-16:~# export LD_LIBRARY_PATH=/root/libtemp/ ts7800-16:~# ls ls: /root/libtemp/libgcc_s.so.1: version 'GCC_3.5' not found (required by ls) ls: /root/libtemp/libc.so.6: version 'GLIBC_2.4' not found (required by ls) ls: /root/libtemp/libc.so.6: version 'GLIBC_2.4' not found (required by /lib/libselinux.so.1) ls: /root/libtemp/libc.so.6: version 'GLIBC_2.4' not found (required by /lib/librt.so.1) ls: /root/libtemp/libpthread.so.0: version 'GLIBC_2.4' not found (required by /lib/librt.so.1) ls: /root/libtemp/libc.so.6: version 'GLIBC_2.4' not found (required by /lib/libacl.so.1) ls: /root/libtemp/libc.so.6: version 'GLIBC_2.4' not found (required by /lib/libdl.so.2) ls: /root/libtemp/libc.so.6: version 'GLIBC_2.4' not found (required by /lib/libattr.so.1)

在我看来,他们也在使用其他版本的GLIBC(如果我错了,请原谅我的无知)

我确实检查了linux版本,以下是两个:

ts7800-16:〜#more / etc / debian_version

6.0.3

root @ ts7800:root #more / etc / debian_version

3.1 Sarge

2 个答案:

答案 0 :(得分:2)

  

如何在较新的Linux中运行需要较旧的glibc库的二进制文件?

GLIBC保持向后兼容性 - 较旧的二进制文件继续在较新的系统上运行。这意味着通常你不需要做任何事情 - 你的旧二进制文件只是运行。

 /lib/ld-linux.so.2 => /lib/ld-linux.so.3 (0x2a000000)

该行非常很奇怪(注意23外部版本。它表明您实际上在系统上使用其他而不是GLIBC(这也可以解释为什么它缺少所有GLIBC*版本标签)。

  

当我将二进制文件放入较新的linux并尝试运行它时,它会告诉“没有这样的文件或目录”错误

这种情况正在发生,因为您的二进制文件请求/lib/ld-linux.so.2作为其程序解释器,但您可能根本没有该文件(而是/lib/ld-linux.so.3,无论是什么)。< / p>

<强>更新

您可能正在为嵌入式ARM linux编译的Google搜索suggests

您的问题不是您构建的系统比您尝试运行的系统旧。您的问题是不同。您正在构建(定位)GLIBC(您的工具链就是这样),但您正在运行uClibc或其他一些libc的系统上运行。

您需要在目标上安装GLIBC,或者告诉您的工具链定位uClibc

答案 1 :(得分:0)

错误消息对我来说有点奇怪。

首先,ld(动态链接器)应该能够找到一个库。例如,您的错误消息显示了三次尝试GLIBC。我不相信您的可执行文件需要运行三个版本。

第二件事是,通常较旧的程序也运行较新的标准库。特别是GLIBC也应该使用非常旧的可执行文件。

接下来的事情是,我 belive 您已经从系统中卸载了一些库,但库数据库仍然保存了一些缓存的信息。

我会请你:

sudo ldconfig

设置正确的动态库缓存。

之后请告诉我们结果 ldd ./test.exe

如果您尝试执行静态链接,则必须具有要链接的库的版本。如果您有这些库,您也可以以动态方式使用它。我无法相信您有.a个文件,但没有同一个库的.so文件。

或者是否存在误解并且您使用了2个系统,一个是您正在编译的系统而另一个是您正在执行二进制文件?如果是这样,我们也会找到一个解决方案,可能还有静态链接。