Path

LD_LIBRARY_PATH 的預設值是多少?

  • February 17, 2022

就我而言,似乎LD_LIBRARY_PATH設置為空字元串。但是所有標準系統工具仍然可以正常工作,所以我猜動態連結器會檢查這種情況並LD_LIBRARY_PATH在這種情況下使用一些預設值。

那個預設值是多少?我想它至少包括/usr/lib但還有什麼?有沒有什麼好的系統方法來確定動態連結器搜尋的標準位置?

這個問題與動態連結器將搜尋的路徑略有不同。具有預設值意味著它將使用如果給定的值LD_LIBRARY_PATH,或者如果沒有給出,它將使用預設值 - 這意味著它不會使用如果提供了預設值LD_LIBRARY_PATH

Linux 上常用的動態連結器使用記憶體來查找其庫。記憶體儲存在 中/etc/ld.so.cache,並通過ldconfig它在給出的路徑上進行更新/etc/ld.so.conf(現在通常是 中的文件/etc/ld.so.conf.d)。它的內容可以通過執行列出ldconfig -p

所以沒有預設值LD_LIBRARY_PATH,預設庫查找根本不需要它。如果LD_LIBRARY_PATH已定義,則首先使用它,但不會禁用其他查找(其中還包括一些預設目錄)。

ld.so(8)手冊頁有詳細資訊:

如果共享對象依賴項不包含斜線,則按以下順序搜尋它:

  • 如果存在且屬性不存在DT_RPATH,則使用二進製文件的動態部分屬性中指定的目錄。DT_RUNPATH不推薦使用DT_RPATH
  • 使用環境變數LD_LIBRARY_PATH,除非執行檔在安全執行模式下執行(見下文),在這種情況下它會被忽略。
  • 使用DT_RUNPATH二進製文件的動態部分屬性中指定的目錄(如果存在)。
  • 來自記憶體文件/etc/ld.so.cache,其中包含先前在擴充庫路徑中找到的候選共享對象的編譯列表。但是,如果二進製文件是使用-z nodeflib連結器選項鍊接的,則會跳過預設路徑中的共享對象。安裝在硬體功能目錄(見下文)中的共享對象優先於其他共享對象。
  • 在預設路徑下/lib,然後/usr/lib。(在某些 64 位架構上,64 位共享對象的預設路徑是 /lib64,然後是/usr/lib64。)如果二進製文件是使用 -z nodeflib連結器選項鍊接的,則跳過此步驟。

如果LD_LIBRARY_PATH為空,則忽略。如果將其設置為空LD_LIBRARY_PATH=:例如),則那些空值將被解釋為目前目錄

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