【问题标题】:How to run a binary which require an older glibc library in an newer Linux?如何在较新的 Linux 中运行需要较旧 glibc 库的二进制文件?
【发布时间】:2014-05-11 14:32:58
【问题描述】:

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

我搜索并发现这是关于不正确的库链接。我在这个二进制文件上使用了 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# 更多 /etc/debian_version

3.1 中士

【问题讨论】:

标签: linux static-libraries static-linking


【解决方案1】:

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

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

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

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

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

发生这种情况是因为您的二进制文件请求 /lib/ld-linux.so.2 作为其程序解释器,但您的系统上可能根本没有该文件(取而代之的是 /lib/ld-linux.so.3,无论如何)。

更新:

Google 搜索 suggests,您可能正在为嵌入式 ARM linux 进行编译。

您的问题不在于您构建的系统比您尝试运行的系统旧。你的问题是它是不同的。您正在为(目标)GLIBC 构建(您的工具链执行此操作),但您在安装了 uClibc 或其他一些 libc 的系统上运行。

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

【讨论】:

  • 非常感谢您的回复!是的,我正在为 ARM 做这件事。我没有提到它,因为我什至没有意识到这很重要。由于评论长度有限,请查看我更新的问题,再次感谢您!
【解决方案2】:

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

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

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

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

我想请你:

sudo ldconfig

设置正确的动态库缓存。

之后,请向我们展示结果 ldd ./test.exe

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

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

【讨论】:

  • 您好,非常感谢您的回复。我正在使用交叉编译器在笔记本电脑 UBUNTU 上为 ARM 嵌入式 linux 编译程序。这是一个复杂的程序(至少对我而言),并且所有配置都已设置好(不幸的是针对该 ARM 上的旧版本)。我使用了 ldconfig,这是输出: ts7800-16:~/dnp# ldconfig ldconfig: /usr/lib/libstdc++.so.6 is not a symbolic link 而且 ldd 的输出没有任何改变。此外,请参阅我更新的问题以获取更多信息。再次感谢您!
猜你喜欢
  • 2016-06-27
  • 2016-08-13
  • 2021-05-11
  • 2011-09-06
  • 2013-10-15
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多