在 64 位系統上執行 32 位二進製文件時收到“未找到”消息
我目前在 debian (wheezy/amd64) 上有一個奇怪的問題。
我創建了一個 chroot 來安裝伺服器(我無法提供更多細節,抱歉)。我們稱它為 path
/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
. 我檢查了訪問權限是否相同,但這並沒有改變任何東西(一個正在工作,另一個沒有)
當您無法執行依賴於“載入程序”的文件時,您得到的錯誤可能是指載入程序而不是您正在執行的文件。
- 動態連結的本機執行檔的載入器是系統中負責載入動態庫的部分。它類似於
/lib/ld.so
or/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 wheezy 開始,如果您希望同時支持 i386 和 x86_64,請從安裝 amd64 開始並啟動多架構支持:
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 到 wheezy 上,32 位載入程序在libc6-i386
包中。您可以通過安裝ia32-libs
.