引子
近日,伺服器遷移後,偷懶未重新編譯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...