我目前在 debian (wheezy/amd64) 上遇到一个奇怪的问题。
我已经创建了一个 chroot 来安装服务器(抱歉,我无法提供更多详细信息)。我们称其为路径/chr_path/
。为了让事情变得简单,我使用 debootstrap(也是 wheezy/amd64)初始化了这个 chroot。
一切似乎都在 chroot 内运行良好,但是当我启动服务器的安装程序脚本时,我得到:(
zsh: Not found /some_path/perl
由于某些原因,安装程序包含一个 perl 二进制文件)
自然地,我检查了/some_path/
位置并找到了“perl”二进制文件。file
在 chroot 环境中返回:
/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped
该文件存在,看起来没问题,具有正确的权限。我可以在上面使用file
, ls
,vim
但一旦我尝试执行它 -./perl
例如 - 我得到:zsh: Not found ./perl
。
这种情况对我来说是可以理解的。而且 :
- 我可以在 chroot 中执行其他基本二进制文件(/bin/ls,...)而不会出现错误
- 我对该项目附带的其他二进制文件也有同样的问题
- 当我尝试从主根 (
/chr_path/some_path/perl
) 执行二进制文件时,它起作用了。 - 我尝试将其中一个二进制文件与我的
ls
.我检查了访问权限是否相同,但这没有改变任何东西(一个正在工作,另一个没有)
答案1
当您无法执行依赖于“加载器”的文件时,您收到的错误可能涉及加载器而不是您正在执行的文件。
- 动态链接的本机可执行文件的加载器是系统中负责加载动态库的部分。它类似于
/lib/ld.so
或/lib/ld-linux.so.2
,并且应该是一个可执行文件。 - 脚本的加载器是 shebang 行中提到的程序,例如
/bin/sh
以 . 开头的脚本#!/bin/sh
。 (在这种情况下,Bash 和 zsh 给出的消息是“错误的解释器”,而不是“找不到命令”。)
该错误消息相当具有误导性,没有表明加载程序是问题所在。不幸的是,解决这个问题很困难,因为内核接口只有报告数字错误代码的空间,而没有空间指示该错误实际上涉及不同的文件。有些 shell 自己为脚本做这些工作(读取#!
脚本上的行并重新计算错误条件),但我见过没有一个 shell 尝试对本机二进制文件执行相同的操作。
ldd
也不适用于二进制文件,因为它的工作原理是设置一些特殊的环境变量,然后运行程序,让加载程序完成工作。strace
也不会提供任何有意义的信息,因为它不会报告超出内核报告的内容,并且正如我们所见,内核无法报告它所知道的所有信息。
当您尝试为正确的系统(或系统系列)和超体系结构运行二进制文件,但为错误的子体系结构运行二进制文件时,通常会出现这种情况。这里,您在需要 ELF 二进制文件的系统上有 ELF 二进制文件,因此内核可以很好地加载它们。它们是在 x86_64 处理器上运行的 i386 二进制文件,因此这些指令是有意义的,并使程序能够查找其加载程序。但该程序是一个 32 位程序(如输出file
所示),正在寻找 32 位 loader ,并且您可能只在 chroot 中/lib/ld-linux.so.2
安装了 64 位加载程序。/lib64/ld-linux-x86-64.so.2
您需要在 chroot 中安装 32 位运行时系统:加载程序以及程序所需的所有库。从 Debian wheezy 开始,如果您想要 i386 和 x86_64 支持,请从 amd64 安装开始并激活多架构support:运行然后dpkg --add-architecture i386
(如果你想生成Debian的perl包的依赖项列表,看看可能需要哪些库,你可以使用)。您可以通过安装来拉取公共库的集合apt-get update
apt-get install libc6:i386 zlib1g:i386 …
aptitude search -F %p '~Rdepends:^perl$ ~ri386'
ia32-libs
包(您需要首先启用多架构支持)。在 Debian amd64 到 wheezy 上,32 位加载器位于libc6-i386
包裹。您可以通过安装来安装更大的 32 位库集ia32-libs
。
答案2
ldd(1)
在您的二进制文件上运行perl
。通常,Not found
明显存在的文件上看似令人困惑的错误是因为找不到程序使用的共享库之一。
因此,对于二进制文件所需的共享库,您的 chroot 可能不完整。