2013-01-23 21 views
4

我對以下命令序列感到困惑。Schrödinger的文件

sh-4.2$ pwd 
/home/willard 
sh-4.2$ ls -l f 
-rwxr-xr-x 1 willard users 59116 Jan 23 14:54 f 
sh-4.2$ file f 
f: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, BuildID[sha1]=0xea0e08ff2b5a062698d45b78177acdd6bf140d1f, stripped 
sh-4.2$ ./f 
sh: ./f: No such file or directory 
sh-4.2$ strace ./f 
execve("./f", ["./f"], [/* 32 vars */]) = -1 ENOENT (No such file or directory) 
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory 
) = 40 
exit_group(1)       = ? 
+++ exited with 1 +++ 
sh-4.2$ ls -l f 
-rwxr-xr-x 1 willard users 59116 Jan 23 14:54 f 
sh-4.2$ uname -a 
Linux xdat10 3.6.2-1-ARCH #1 SMP PREEMPT Fri Oct 12 23:58:58 CEST 2012 x86_64 GNU/Linux 

這怎麼可能?

+0

有人在欺騙你,並迅速刪除你執行的第二個和第三個命令之間的文件? (我無法使用Ubuntu重現它) – Veger

+0

eek ...前後ls f'的輸出是什麼? –

+0

這是否始終如一?還是這是一次性的事情? –

回答

4

我發現有同樣的問題(相對解釋)有人

Running 32bit binary on a 64bit system

引用最重要的句子:

當您嘗試運行的二進制這種情況經常發生系統(或系統系列)和超結構,但是錯誤的子系統結構 。在這裏,您在系統上安裝了ELF二進制文件,該文件需要使用ELF二進制文件,因此內核將它們加載得很好。它們是在x86_64處理器上運行的i386 二進制文件,所以指令使 有意義並使程序達到它可以查找其加載程序的位置 。但該程序是一個32位程序(如文件輸出 所示),查找32位裝載程序/lib/ld-linux.so.2和 ,您大概只會安裝64位裝載程序 /lib64/ld-linux-x86-64.so.2在chroot中。

您需要在chroot中安裝32位運行時系統: 加載程序以及程序所需的所有庫。在Debian amd64上, 32位加載器位於libc6-i386包中。通過安裝ia32-libs,您可以安裝一組更大的 32位庫。

我敢打賭,有一個更好的方法來驗證這一點,但我會盡量給exec

ldd ./f 

,並在需要的裝載​​機exec'it

1

人2 execve的輸出搜索:

ENOENT The file filename or a script or ELF interpreter does not 
     exist, or a shared library needed for file or interpreter can‐ 
     not be found. 

您可以運行ldd對這個二進制從尋找那些無法映射庫和安裝它們。

相關問題