Executable

在 64 位系統上執行 32 位二進製文件時收到“未找到”消息

  • October 1, 2018

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

引用自:https://unix.stackexchange.com/questions/13391