window和linux下有關xxx.dll和xxx.so動態庫,可執行文件運行時的動態庫檢索路徑文檔

沒想到詳細的內容都在庫和命令的man手冊中。


ld.so動態庫手冊裏有描述ELF可執行文件在運行時,都會在哪幾個位置檢索動態庫。

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

(1) 使用二進制文件的 DT_RPATH 動態節屬性中指定的目錄(如果存在且 DT_RUNPATH 屬性不存在)。 不推薦使用 DT_RPATH。

(2) 使用環境變量 LD_LIBRARY_PATH,除非可執行文件正在安全執行模式下運行(見下文),在這種情況下該變量將被忽略。

(3) 使用二進制文件的 DT_RUNPATH 動態節屬性中指定的目錄(如果存在)。 搜索此類目錄只是爲了查找 DT_NEEDED(直接依賴項)條目所需的那些對象,並且不適用於這些對象的子對象,這些對象本身必須有自己的 DT_RUNPATH 條目。 這與 DT_RPATH 不同,DT_RPATH 用於搜索依賴樹中的所有子項。

(4) 來自緩存文件/etc/ld.so.cache,其中包含先前在增強庫路徑中找到的候選共享對象的已編譯列表。 但是,如果二進制文件是使用 -z nodeflib 鏈接器選項鍊接的,則將跳過默認路徑中的共享對象。 安裝在硬件功能目錄(見下文)中的共享對象優先於其他共享對象。

(5) 在默認路徑/lib 中,然後在/usr/lib 中。 (在某些 64 位體系結構上,64 位共享對象的默認路徑是 /lib64,然後是 /usr/lib64。)如果二進制文件是使用 -z nodeflib 鏈接器選項鍊接的,則將跳過此步驟。


ld命令手冊,描述-rpath將目錄添加到運行時庫搜索路徑。

將目錄添加到運行時庫搜索路徑。 當將 ELF 可執行文件與共享對象鏈接時使用。 所有 -rpath 參數都連接起來並傳遞給運行時鏈接器,後者使用它們在運行時定位共享對象。
當定位鏈接中顯式包含的共享對象所需的共享對象時,也會使用 -rpath 選項; 請參閱 -rpath-link 選項的說明。
僅使用 --with-sysroot 選項配置的本機鏈接器和交叉鏈接器支持以這種方式搜索 -rpath。
如果在鏈接 ELF 可執行文件時未使用 -rpath,則將使用環境變量“LD_RUN_PATH”的內容(如果已定義)。 -rpath 選項也可用於 SunOS。
默認情況下,在 SunOS 上,鏈接器將從給定的所有 -L 選項中形成運行時搜索路徑。 如果使用 -rpath 選項,則將僅使用 -rpath 選項形成運行時搜索路徑,而忽略 -L 選項。
這在使用 gcc 時很有用,它添加了許多可能位於 NFS 安裝的文件系統上的 -L 選項。
爲了與其他 ELF 鏈接器兼容,如果 -R 選項後跟目錄名而不是文件名,則將其視爲 -rpath 選項。


window下dll動態庫的搜索路徑

window下dll動態庫的xxx.dll.a導入庫的說明


readelf命令可顯示有關 ELF 文件的信息

其他

  1. cmake關於.dll.a導入庫的說明和window運行時動態庫搜索路徑的設置討論
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章