2014-10-05 48 views
1

我有以下內容的目錄:libc.so.2是否需要位於/ usr/lib中?

bin/busybox 
lib/ld-linux.so.2 
lib/libc.so.6 

,當我調用:

chroot . bin/busybox sh 

它失敗,出現以下:

/bin/busybox: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory 

當我移動的lib/libc中。 so.6到usr/lib,它工作正常。

爲什麼libc需要在/ usr/lib中?當我調用:

objcdump -p bin/busybox | grep NEEDED 

我得到:

NEEDED  libc.so.6 

所以我想,因爲只有庫的soname是沒有斜線等使用的加載就可以找到它的標準文件夾,它是/ lib和/ usr/lib。顯然,情況並非如此。

要更加混亂使事情,LD-linux.so.2似乎已經是在/ lib中,因爲當它被移動到/ usr/lib目錄,chroot的失敗:

chroot: failed to run command '/bin/busybox': No such file or directory 

我學到的實際上是加載程序找不到的錯誤,而不是busybox二進制文件。

libc.so.2 distro具體問題是否存在?如果這很重要,我使用Arch Linux。

+1

在編譯時設置LD_RUN_PATH,或者在運行之前通過導出LD_LIBRARY_PATH來設置庫搜索路徑 – camelccc 2014-10-05 17:41:13

+0

或者執行ln -s /lib/libc.so.6 /usr/lib/libc.so.6 – yoK0 2014-10-05 17:51:09

+0

謝謝。這些方法可以解決這些問題(除了將這些文件保存在目錄中以使其全部工作之外),但不要解釋原始行爲。 – wujek 2014-10-05 19:13:24

回答

3

加載程序的位置(通常類似於/lib/ld-linux.so)在二進制文件中被硬編碼。這個組件沒有搜索過程 - 如果找不到,二進制文件根本不會運行。

(確切路徑取決於你所使用的libc和體系結構,它是在/lib64/ld-linux-x86-64.so.2用於在x86_64 glibc的,例如。)

將要搜索的動態庫的位置是在/etc/ld.so.conf配置。如果你在chroot中沒有這個文件,那麼有些標準路徑可能沒有配置!

+0

硬編碼加載器是否存儲在.interp頭部分中?我雖然.interp secion實際上有加載程序代碼。 是的,我沒有ld.so.conf。我認爲/ lib和/ usr/lib是默認的默認值; d即使在沒有其他定義的情況下也可以使用。 – wujek 2014-10-05 19:02:48

+0

加載器的路徑存儲在'.interp'節中,而不是加載器的代碼。 (在我的系統上,加載器在磁盤上大約爲150K,這對於包含在每個二進制文件中將是相當大的!) – duskwuff 2014-10-05 19:12:24

+0

我對這個人的寫法感到困惑8 ld.so:(...)動態鏈接器存儲在.interp節(...) 我讀鏈接器可能會被任意代碼所取代,這就是爲什麼在未經檢測的二進制文件上調用ldd可能會有危險。這樣的替換是否取代裝載機的位置?它接受相對路徑嗎? – wujek 2014-10-05 19:18:42