我正在尝试运行一个程序,但是当我执行它时出现以下错误:
./app: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./app)
起初我读到手动升级glibc
,但对于像我这样的非高级用户来说似乎风险太大。我的一个朋友告诉我,chroot
但我不确定我必须遵循的步骤。谁能帮我 ?
我的系统信息:
uname -a:Linux hostName 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
Distro: Crunchbang 11 (Waldorf)
ldd --version: ldd (Debian EGLIBC 2.13-38+deb7u8) 2.13
ldd ./app:
linux-vdso.so.1 => (0x00007ffdd593d000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007febe6450000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007febe623a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007febe5eae000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007febe5c2c000)
/lib64/ld-linux-x86-64.so.2 (0x00007febe677a000)
答案1
首先,您需要意识到,如果您收到这样的消息,则您尝试运行的应用程序不适用于该平台/发行版。所以,它很可能会以最痛苦的方式崩溃,带走你所有的文件、金钱和房子:)
特别是,这与 (g)libc 有关,因为它与内核 ABI 紧密相连,并且运行为不同版本的 ABI 编译的 glibc 是有风险的。这就是库版本控制背后的原因。
如果在所有这些警告之后您仍然想尝试一下,您可以按复杂程度顺序使用以下内容:
将适当的库解压到您的应用程序所在的同一目录(或任何其他杰出的目录)中,然后运行以下
app
命令:LD_LIBRARY_PATH=. ./app
您可以通过测试来检查是否选择了正确的库LD_LIBRARY_PATH=. ldd ./app
。请注意,这不适用于root
user 和 suid 应用程序。
您实际上可以尝试为应用程序创建 chroot 环境。请记住,该
chroot
调用会重置根 (/) 目录下运行的应用程序的位置。实际上,这意味着您不仅需要提供替换glibc
库,还需要提供全部您的应用程序使用的库以及这些库使用的库等等,直到您拥有创建自给自足环境的一切。这还意味着至少存在/dev/null
、/dev/stdin
、/dev/stdout
和/dev/log
设备以及/etc/passwd
和/etc/group
文件。 Debian 上此类环境的一个很好的例子是postfix
安装(检查/var/spool/postfix/
)。启动命令本身很简单:chroot /home/of/chrooted/app ./app
最好和最简单的方法是使用
docker
适合您的应用程序的适当图像。安装docker
本身就是一个很大的话题,你可以从Docker安装指南。 Linux 内核大于 3.8+ 是它的一个先决条件。除了这个限制之外,这是运行需要不同发行版/库集的应用程序的最佳方式。
答案2
安装具有目标版本的发行版的 chroot 环境是最省力的解决方案。它可能会花费你几 GB 的磁盘空间,但它相当轻松,特别是在 Debian 及其衍生版本上施鲁特完成设置可用 chroot 环境的工作反引导程序可以在该 chroot 环境中安装较旧或较新版本的 Debian 或 Ubuntu。看如何在 64 位 Debian/Ubuntu 上运行 32 位程序?了解 schroot+debootstrap 指南。对于 GLIBC 2.14,您可以选择jessie
(Debian) 或precise
( trusty
Ubuntu) 作为使用 debootstrap 安装的版本。
使用默认的 schroot 设置,您可以运行类似的命令
schroot -c jessie ./app
您的主目录将自动位于 chroot 中的同一路径中。只要应用程序安装在您的主目录下,并且只需要访问您的主目录下的其他文件或 chroot 中存在的软件,就可以了。