1. 程式人生 > >linux上的兩種可執行程式

linux上的兩種可執行程式

一、 Linux 系統上有兩類的 Linux 可執行程式。

1、 靜態連結的可執行程式。靜態可執行程式包含執行所需的所有函式 — 換句話說,它們是“完整的”。因為這一原因,靜態可執行程式不依賴任何外部庫就可以執行。
2、 動態連結的可執行程式。
 靜態程式與動態程式的區別: 動態程式是不完整的程式,所佔的空間小,依靠外部共享庫來提供執行所需的大部分函式

二、 ldd 命令來確定某一特定可執行程式是否為靜態連結的

#ldd /sbin/sln
not a dynamic executable

#ldd /bin/ln
libc.so.6 => /lib/libc.so.6 (0x40021000)
/lib/ld
-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

三、 如果動態可執行程式不包含執行所需的所有函式,Linux 的哪部分負責將這些程式和所有必需的共享庫一起裝入,以使它們能正確執行呢?答案是動態裝入器(dynamic loader)

要檢視 ldconfig 可以“看到”的所有共享庫,請輸入:

# ldconfig -p | less

四、 另一個方便的技巧可以用來配置共享庫路徑。有時候您希望告訴動態裝入器在嘗試任何 /etc/ld.so.conf 路徑以前先嚐試使用特定目錄中的共享庫。在您執行的較舊的應用程式不能與當前安裝的庫版本一起工作的情況下,這會比較方便。

LD_LIBRARY_PATH

  要指示動態裝入器首先檢查某個目錄,請將 LD_LIBRARY_PATH 變數設定成您希望搜尋的目錄。多個路徑之間用冒號分隔;例如:

# export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"

  匯出 LD_LIBRARY_PATH 後,如有可能,所有從當前 shell 啟動的可執行程式都將使用 /usr/lib/old 或 /opt/lib 中的庫,如果仍不能滿足一些共享庫相關性要求,則轉回到 /etc/ld.so.conf 中指定的庫