動態連結器/載入器庫 - 缺少 ld.so
以下手冊描述了動態連結器/載入器庫:
程序 ld.so 處理 a.out 二進製文件,這是一種很久以前使用的格式;ld-linux.so* 處理 ELF(/lib/ld-linux.so.1 用於 libc5,/lib/ld-linux.so.2 用於 glibc2),每個人都已經使用多年了。
我使用 Ubuntu 15.04,但沒有ld.so。我的系統包含一些指向 ld-2.21.so 的符號連結:
/lib/ld-linux.so.2 -> /lib32/ld-linux.so.2 /lib32/ld-linux.so.2 -> ld-2.21.so /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.21.so
這是否意味著系統無法處理 a.out 二進製文件(因為沒有配備 ld.so)?此外,ld-linux.so.2 是一個符號連結,而不是手冊中描述的 lib。怎麼解釋?
您的系統沒有
/lib/ld.so
,因此它沒有配備動態連結的 a.out 執行檔。如果您的核心支持靜態連結的 a.out 執行檔,它可以配備它們;Ubuntu 沒有(這需要CONFIG_BINFMT_AOUT
核心配置選項)。a.out 格式在 Linux 上已經過時了大約 20 年,並且已經過時了大約 15 年,因此今天的大多數係統已經停止支持它。
/lib/ld-linux.so.1
並且/lib/ld-linux.so.2
是 GNU/Linux ELF 動態載入器的兩個不同版本,每個版本都有自己的ABI。版本 1 對應於 libc5,僅比 a.out 少了幾年就已經過時,並且在今天的大多數係統上都不受支持。版本 2,對應於 GNU libc6,是最新的。每個架構都有自己的動態載入器命名約定和版本號(不同的處理器架構實際上有不同的 ABI)。
/lib/ld-linux.so.2
是 x86_32 名稱。在 x86_64 上,通常的位置是/lib64/ld-linux-x86-64.so.2
. 在 armel 上,位置是/lib/ld-linux.so.3
,在 armhf 上/lib/ld-linux-armhf.so.3
,依此類推。
/lib/ld-linux.so.2
是一個庫(或者更準確地說,一個動態連結的共享對象——動態載入器通常不稱為庫)。它是指向正常文件而不是正常文件的符號連結這一事實並沒有改變這一點:使它成為庫的是它的內容。