it-swarm.cn

在64位系统上运行32位二进制文​​件时收到“未找到”消息

我目前在debian(wheezy/AMD64)上遇到一个奇怪的问题。

我已经创建了一个chroot来安装服务器(抱歉,我无法提供更多详细信息)。我们将其路径称为/chr_path/。为了使事情变得容易,我已经用debootstrap(也是wheezy/AMD64)初始化了此chroot。

在chroot中,一切似乎都可以正常工作,但是当我启动服务器的安装程序脚本时,我得到了:zsh: Not found /some_path/Perl(出于某些原因,安装程序包含Perl二进制文件)

自然地,我检查了/some_path/的位置,然后找到了“ Perl”二进制文件。 chroot环境中的file返回:

/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

该文件存在,看起来不错,具有正确的权限。我可以在它上使用filelsvim,但是一旦我尝试执行它,例如./Perl-我得到:zsh: Not found ./Perl

这种情况对我来说是可以理解的。此外:

  • 我可以在chroot中执行其他基本二进制文件(/ bin/ls,...)
  • 对于项目随附的其他二进制文件,我也有同样的问题
  • 当我尝试从主根目录(/chr_path/some_path/Perl)执行二进制文件时,它可以工作。
  • 我试图将其中一个二进制文件与ls的副本放在一起。我检查了访问权限是否相同,但这并没有改变任何内容(一个正在工作,另一个则没有)
72
Elenaher

当您无法执行依赖于“加载程序”的文件时,您得到的错误可能与加载程序有关,而不是您正在执行的文件。

  • 动态链接的本机可执行文件的加载程序是系统中负责加载动态库的部分。它类似于_/lib/ld.so_或_/lib/ld-linux.so.2_,应该是一个可执行文件。
  • 脚本的加载程序是Shebang线上提到的程序,例如_/bin/sh_表示以_#!/bin/sh_开头的脚本。 (在这种情况下,Bash和zsh会给出一条消息“错误的解释器”,而不是“找不到命令”。)

该错误消息颇有误导性,因为它没有表明加载程序是问题所在。不幸的是,要修复此问题将很困难,因为内核接口仅具有报告数字错误代码的空间,而不能同时表明错误实际上与另一个文件有关。某些shell会自行完成脚本的工作(读取脚本上的_#!_行并重新计算错误条件),但是我没有看到尝试对本机二进制文件执行相同的操作。

ldd在二进制文件上也不起作用,因为它可以通过设置一些特殊的环境变量然后运行程序,让加载程序完成工作来起作用。 strace也不会提供任何有意义的信息,因为它所报告的内容不会超过内核所报告的内容,而且如我们所见,内核无法报告其所知道的一切。

当您尝试为正确的系统(或系统系列)和超级体系结构但错误的子体系结构运行二进制文件时,通常会出现这种情况。在这里,在需要ELF二进制文件的系统上有ELF二进制文件,因此内核可以很好地加载它们。它们是在x86_64处理器上运行的i386二进制文件,因此这些说明很有意义,可以使程序达到可以查找其加载程序的地步。但是该程序是一个32位程序(如file输出所示),正在寻找32位加载器_/lib/ld-linux.so.2_,并且您大概只安装了64位加载器_/lib64/ld-linux-x86-64.so.2_在chroot中。

您需要在chroot中安装32位运行时系统:加载程序以及程序所需的所有库。从Debian狂奔开始,如果您同时希望同时支持i386和x86_64,请先安装AMD64并激活 multiarch 支持:先运行_dpkg --add-architecture i386_,然后再运行_apt-get update_和_apt-get install libc6:i386 zlib1g:i386 …_(如果要生成Debian Perl软件包依赖项的列表,以查看可能需要哪些库,可以使用_aptitude search -F %p '~Rdepends:^Perl$ ~ri386'_)。您可以通过安装 _ia32-libs_ 软件包来获取一组公共库(您需要首先启用多体系结构支持)。在Debian AMD64或更高版本上,32位加载程序位于 _libc6-i386_ 软件包中。您可以通过安装 _ia32-libs_ 来安装更多的32位库。

75

Perl二进制文件上运行ldd(1)。通常,由于没有找到该程序使用的共享库之一,因此在显然存在的文件上看似令人困惑的Not found错误。

因此,对于您的二进制文件所需的共享库,您的chroot可能不完整。

5
camh