動態庫的裝載

2021-09-29 04:38:32 字數 1549 閱讀 7630

檢視動態連線庫的相關命令

動態庫的常見問題

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

環境變數ld_library_path指定路徑;(多用於臨時指定)

library_path和ld_library_path是linux下的兩個環境變數,二者的含義和作用分別如下:

library_path環境變數用於在程式編譯期間查詢動態鏈結庫時指定查詢共享庫的路徑,例如,指定gcc編譯需要用到的動態鏈結庫的目錄.

ld_library_path環境變數用於在程式載入執行期間查詢動態鏈結庫時指定除了系統預設路徑之外的其他路徑,注意,ld_library_path中指定的路徑會在系統預設路徑之前進行查詢。

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

linux下的共享庫機制採用了類似於快取記憶體的機制,將庫資訊儲存在/etc/ld.so.cache裡邊。程式連線的時候首先從這個檔案裡邊查詢

ldconfig是乙個動態鏈結庫管理命令,其用途來生成/etc/ld.so.cache. 生成過程如下:

在預設搜尋目錄(/lib和/usr/lib)以及動態庫配置檔案/etc/ld.so.conf內所列的目錄下,搜尋出可共享的動態鏈結庫(格式如前介紹,lib*.so*),進而建立出動態裝入程式(ld.so)所需的連線和快取檔案,快取檔案預設為 /etc/ld.so.cache.

gcc -l 指定的目錄

gcc的環境變數library_path

編譯gcc時寫在程式內的內定目錄例如:/lib/:/usr/lib/:/usr/lib/x86_64-linux-gnu/7/…

gcc的選項-print-search-dirs,會顯示顯示編譯器的搜尋路徑,其中 libraries 選項就是上面所說的動態庫搜尋路徑。

ldconfig

通常在系統啟動時執行,而當使用者安裝了乙個新的動態鏈結庫時,就需要手工執行這個命令.

常用命令 ldconfig -p //列印出ld.so.cache快取中的動態鏈結庫

ldd

ldd不是乙個可執行程式,而只是乙個shell指令碼

ldd能夠顯示可執行模組的dependency,其原理是通過設定一系列的環境變數例如:ld_trace_loaded_objects,將其設定為1,在執行會顯示模組的dependency,而程式並不真正執行。(本質是通過ld-linux.so(elf動態庫的裝載器)來實現的.

nm用來檢視.so庫中的函式名字

解決:檢視前文提到的搜尋目錄下是否有lib***.so動態庫。

如果有名稱對不對,不對可以符號連線ln -sv過去。

解決:sudo apt-get install gcc-x-multilib //x是gcc對應的版本

Linux 動態裝載庫(dlopen)

linux有時我們需要在執行時指定庫的路徑去載入庫,而不是依賴於系統自動動態鏈結。比如說我們在需要做到動態載入庫外掛程式時就會用到動態裝載庫的特性 比如像lighthttpd和nginx的動態mod功能 linux提供了函式來幫助我們做到這件事,主要的幾個函式為 dlopen,dlsym,dlclo...

linux下編譯 鏈結 裝載 動態庫和靜態庫的學習

linux下編譯 鏈結和裝載.自己在linux上編譯 鏈結 動態庫和靜態庫的學習筆記 編譯生成可執行檔案 我們在單獨編譯的時候,只需要檢查標頭檔案,因為都放到了乙個目錄,所以單獨編譯的時候,不需要依賴其他檔案,就可以生成目標檔案 o 如下 g c showcoor.cpp g c showpoint...

動態分割槽裝載資料

乙個個分割槽匯入,分割槽需要做到一對一。hive zmgdb insert overwrite table p t3 partition city ningbo select name,post,address from p t1 where city ningbo 會啟動mapreduce進行匯入...