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


70

我目前在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

该文件存在,看起来不错,具有正确的权限。我可以使用filelsvim它但只要我努力去执行它- ./perl例如-我得到:zsh: Not found ./perl

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

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

1
这与Optware安装的二进制文件上的“没有此类文件或目录”相同。请注意,您的Perl是32位可执行文件。您缺少32位运行时系统(libc6-i386软件包,或者ia32-libs如果您需要大量库)。
吉尔斯(Gilles)

@吉尔斯:非常感谢!合适的安装ia32-libs解决了该问题!我已经看到了perl是32位的,但是由于它在主系统上工作(相同的distrib),所以我以为它没有链接。实际上,我有时必须已经在主系统上安装了32位运行时系统。
Elenaher 2011年

1
@吉尔斯:我想我将其添加为一个简洁的答案,而不是将其标记为重复的问题。环境是足够不同的,即使问题是相同的,搜索人员也更有可能碰到另一个。
卡莱布(Caleb)

1
@Caleb正是出于这个原因,我们不会删除重复项;找到该帖子的搜索者将仅点击指向另一帖子的重复链接。如果是同一问题,则可能应该将其关闭
Michael Mrozek

@MichaelMrozek我已经对这个问题改变了主意:尽管基本问题相同,但具体的补救措施有所不同(一种情况下不混合使用ARM ABI,而另一种情况下支持对amd64 Linux发行版的32位支持) 。所以我想这个问题毕竟是公开的。
吉尔斯

Answers:


72

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

  • 动态链接的本机可执行文件的加载程序是系统中负责加载动态库的部分。类似于/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,并且您大概只/lib64/ld-linux-x86-64.so.2在chroot中安装了64位加载程序。

您需要在chroot中安装32位运行时系统:加载程序以及程序所需的所有库。从Debian开始,如果您同时需要i386和x86_64的支持,请先安装amd64并激活多体系结构的支持:dpkg --add-architecture i386然后运行apt-get updateand apt-get install libc6:i386 zlib1g:i386 …(如果要生成Debian perl软件包的依赖关系列表,请查看可能使用的库需要时,可以使用aptitude search -F %p '~Rdepends:^perl$ ~ri386')。您可以通过安装ia32-libs软件包来获取一组公共库(您需要首先启用多体系结构支持)。在Debian amd64(直到wheezy)上,软件包中包含32位加载libc6-i386程序。您可以通过安装来安装更多的32位库ia32-libs


这是唯一可以触发错误消息的事情吗?我已经安装了32位库,这是的输出,ldd但是我仍然遇到相同的错误。
内森·奥斯曼


我尝试安装,lsb-core但似乎没有帮助。我认为我最好为此提出一个新问题。
内森·奥斯曼

谢谢您,您刚刚结束了为期两天的艰苦工作。我以为所有内容都是静态编译的,但事实并非如此!
Finn O'leary

5

ldd(1)在您的perl二进制文件上运行。通常,Not found由于没有找到该程序使用的共享库之一,显然存在文件上的看似混乱的错误。

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


实际上,我得到了:perl is not a dynamic executable当我在chroot中时,我从外部获得了正确的依赖关系列表。我目前正在检查是否有奇怪的东西,但是我使用了debootstrap来避免这种不足,并且已经有了许多库(chroot系统中有一个perl可执行文件,可以很好地运行,但是它是一个不同的版本;也许我会做一些事情)符号链接?)
Elenaher 2011年

老实说,我希望debootstrap能够产生完整的chroot,所以我不希望我的回答在这方面是正确的。但是我之前在chroot问题中遇到了缺少的库,所以我想我可以看看答案是否正确。
卡姆(Camh)2011年

cf. 在主要帖子上对吉尔斯的评论:你是对的。缺少一些库。debootstrap的主要优点是我可以通过基本的
智能
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.