Linux(gnu)環境動態鏈結庫的搜尋路徑

2021-06-19 00:39:13 字數 1561 閱讀 2994

man ld.so(8)說,如果庫依賴不包括「/」,那麼它將按照下面的規則按順序搜尋:

看起來夠簡潔的,當做休閒,寫個程式驗證一下。但在這之前,先介紹乙個glibc擴充套件的函式(posix中沒有)

#define _gnu_source

#include int dladdr(void* addr, dl_info *info);

這個函式解析傳入的函式指標(第乙個引數),將資訊填充到dl_info的結構體

typedef struct  dl_info;
下面是程式以及需要載入的動態庫的**:

ld_main.c:

int main()

ld_lib.c:

#define _gnu_source

#include #include int lib_fun()

編譯這兩個檔案:

1、動態庫:gcc --shared -fpic ld_lib.c -o libld_lib.so -ldl

2、主程式:gcc ld_main.c -o ld_main -wl,-rpath,./  -ldl -lld_lib -l./

-wl,-rpath編譯選項將在程式中生成dt_rpath節點,使用readelf會看到library rpath被設為當前目錄:

接下來將生成的libld_lib.so拷貝到前面介紹到的搜尋路徑:

對於ld_library_path,隨便設定:

export ld_library_path=../

對於ld.so.conf提到的路徑,在/etc/ld.so.conf.d/下面隨便找乙個,或者自己建立乙個,這裡用系統自帶的libc.conf

中提到的路徑:/usr/local/lib

然後執行(每次都刪除程式優先載入的so檔案):

(ld.so.conf路徑更新檔案後需要執行ldconfig更新cache,否則會找不到檔案,如上圖)。

看來它真起作用了

關於dt_runpath,需要用到--enable-new-dtags鏈結選項:

(linux下程式預設不會從當前路徑搜尋.so檔案,這對於自行開發的分為很多模組,要安裝在同一目錄的「程式」來說不是個優點。還好可以用dt_runpath指定.so的載入路徑)

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...