Linux下動態鏈結庫載入路徑及搜尋路徑問題

2022-09-26 14:48:22 字數 1600 閱讀 5573

引子

近日,伺服器遷移後,偷懶未重新編譯nginx的,直接./nginx啟動,結果遇到如下問題:

「error while loading shared libraries」

這是是因為需要的動態庫不在動態鏈結器ld.so的搜尋路徑導致。

ld.so 程式設計客棧動態共享庫搜尋順序

1、elf可執行檔案中動態段dt_rpath指定;gcc加入鏈結引數「-wl,-rpath」指定動態庫搜尋路徑;

2、環境變數ld_library_path指定路徑;

3、/etc/ld.so.cache中快取的動態庫路徑。可以通過修程式設計客棧改配置檔案/etc/ld.so.conf 增刪路徑(修改後需要執行ldconfig命令);

4、預設的 /lib/;

5、預設的 /usr/lib/

與動態鏈結庫相關命令

(1)ld 是gcc的鏈結程式。

(2)ldd是檢視可執行檔案中所依賴的庫的程式,比如想查main程式用到了那些動態庫,可以直接 
ldd main

(3)ldconfig用來更新檔案/etc/ld.so.conf的修改生效。

(4)nm用來檢視.so庫中的函式名字,標記是t的就是www.cppcns.com動態庫裡面生成的名字。如:nm /lib/libc*.so

linux 下動態鏈結庫搜尋路徑問題

linux動態鏈結庫的搜尋路徑按優先順序排序為:

1.編譯目標**時指定的動態庫搜尋路徑;

在編譯時通過gcc 的引數」-wl,-rpath,」指定。當指定多個動態庫搜尋路徑時,路徑之間用冒號」:」分隔。

2.環境變數ld_libra程式設計客棧ry_path指定的動態庫搜尋路徑;

3.配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑;

/etc/ld.so.conf的第一行有個引用命令:include ld.so.conf.d/*.conf

因此,最優雅的方式是在ld.so.conf.d目錄下建立乙個你的程式依賴的配置檔案,配置檔案內容為程式依賴的動態鏈結庫的路徑,乙個路徑一行。

新增完配置檔案後執行ldconfig使其生效。

4.預設的動態庫搜尋路徑/lib;

5.預設的動態庫搜尋路徑/usr/lib;

1、可以用 ld_library_path 環境變www.cppcns.com量指定,這個類似於 path 機制,比較直觀,而且,可以放到 bashrc 中固化下來,也可以放到自己的 .bashrc 中只對本使用者起作用;

2、如果啟用了 ld.so.cache 的話,系統會在 /etc/ld.so.cache 中儲存所有可引用的動態鏈結庫。這個檔案的內容可以通過 /etc/ld.so.conf 來指定;這個是比較固定的機制,對全域性所有使用者都有影響;不過更改設定後需要 root 呼叫 ldconfig 來重新整理一下。

3、預設的標準庫路徑,這個似乎不用設定就可以。包括 /lib 和 /usr/lib。當然,如果是64位系統,還包括 /lib64 和 /usr/lib64。

4、其它情況,如果只想對某乙個特定的應用程式起作用的話,可以在編譯時指定搜尋路徑。gcc 的 -wl 和 -rpath 引數。

奇怪的是, /usr/local/lib 和 /usr/local/lib64 居然不在標準路徑之列。

總結本文位址:

linux 動態鏈結庫載入

linux 動態鏈結 linux 中的應用程式以以下兩種方式之一鏈結到外部函式 要麼在構建時與靜態庫 lib a 靜態地鏈結,並且將庫 包含在該應用程式的可執行檔案裡 要麼在執行時與共享庫 lib so 動態地鏈結。通過動態鏈結裝入器,將動態庫對映進應用程式的可執行記憶體中。在啟動應用程式之前,動態...

linux下載入動態鏈結庫的方法

linux下載入動態鏈結庫的方法 以下以觸控螢幕為例 介紹是如何載入一下共享庫的。首先讓我們看看以下幾個函式 dlopen 功能 開啟乙個動態鏈結庫 包含標頭檔案 include 函式定義 void dlopen const char pathname,int mode 函式描述 在dlopen的 ...

Linux下動態鏈結庫和靜態鏈結庫

第一部分 編譯過程 預處理過程,負責標頭檔案展開,巨集替換,條件編譯的選擇,刪除注釋等工作。gcc e表示進行預處理。編譯過程,負載將預處理生成的檔案,經過詞法分析,語法分析,語義分析及優化後生成彙編檔案。gcc s表示進行編譯。彙編,是將彙編 轉換為機器可執行指令的過程。通過使用gcc c或者as...