Linux下共享庫(SO)有關的幾個環境變數

2021-08-23 13:11:58 字數 1986 閱讀 5570

linux

支援共享庫已經有悠久的歷史了,不再是什麼新概念了。大家都知道如何編譯、連線以及動態載入(dlopen/dlsym/dlclose)

共享庫。但是,可能很多人,甚至包括一些高手,對共享庫相關的一些環境變數認識模糊。當然,不知道這些環境變數,也可以用共享庫,但是,若知道它們,可能就會用得更好。下面介紹一些常用的環境變數,希望對家有所幫助:

ld_library_path

這個環境變數是大家最為熟悉的,它告訴loader

:在哪些目錄中可以找到共享庫。可以設定多個搜尋目錄,這些目錄之間用冒號分隔開。在linux

下,還提供了另外一種方式來完成同樣的功能,你可以把這些目錄加到/etc/ld.so.conf

中,或則在/etc/ld.so.conf.d

裡建立乙個檔案,把目錄加到這個檔案裡。當然,這是系統範圍內全域性有效的,而環境變數只對當前shell

有效。按照慣例,除非你用上述方式指明,loader

是不會在當前目錄下去找共享庫的,正如shell

不會在當前目前找可執行檔案一樣。

ld_preload

這個環境變數對於程式設計師來說,也是特別有用的。它告訴loader

:在解析函式位址時,優先使用ld_preload

裡指定的共享庫中的函式。這為除錯提供了方便,比如,對於c/c++

程式來說,記憶體錯誤最難解決了。常見的做法就是過載malloc

系列函式,但那樣做要求重新編譯程式,比較麻煩。使用ld_preload

機制,就不用重新編譯了,把包裝函式庫編譯成共享庫,並在ld_preload

加入該共享庫的名稱,這些包裝函式就會自動被呼叫了。在linux

下,還提供了另外一種方式來完成同樣的功能,你可以把要優先載入的共享庫的檔名寫在/etc/ld.so.preload

裡。當然,這是系統範圍內全域性有效的,而環境變數只對當前shell

有效。

ld_ debug

這個環境變數比較好玩,有時使用它,可以幫助你查詢出一些共享庫的疑難雜症(比如同名函式引起的問題)。同時,利用它,你也可以學到一些共享庫載入過程的知識。它的引數如下:

libs display library search paths

reloc display relocation processing

files display progress for input file

symbols display symbol table processing

bindings display information about symbol binding

versions display version dependencies

all all previous options combined

statistics display relocation statistics

unused determined unused dsos

help display this help message and exit

bind_now

這個環境變數與dlopen

中的flag

的意義是一致,只是dlopen

中的flag

適用於顯示載入的情況,而bind_now/bind_not

適用於隱式載入。

ld_profile/ld_profile_output

:為指定的共享庫產生profile

資料,ld_profile

指定共享庫的名稱,ld_profile_output

指定輸出profile

檔案的位置,是乙個目錄,且必須存在,預設的目錄為/var/tmp/

或/var/profile

。通過profile

資料,你可以得到一些該共享庫中函式的使用統計資訊。

Linux下共享庫(SO)有關的幾個環境變數

linux 支援共享庫已經有悠久的歷史了,不再是什麼新概念了。大家都知道如何編譯 連線以及動態載入 dlopen dlsym dlclose 共享庫。但是,可能很多人,甚至包括一些高手,對共享庫相關的一些環境變數認識模糊。當然,不知道這些環境變數,也可以用共享庫,但是,若知道它們,可能就會用得更好。...

Linux下共享庫(SO)有關的幾個環境變數

linux支援共享庫已經有悠久的歷史了,不再是什麼新概念了。大家都知道如何編譯 連線以及動態載入 dlopen dlsym dlclose 共享庫。但是,可能很多人,甚至包括一些高手,對共享庫相關的一些環境變數認識模糊。當然,不知道這些環境變數,也可以用共享庫,但是,若知道它們,可能就會用得更好。下...

linux下構建 共享函式庫( so)

在linux上用c建立共享庫so 1 建立math1.c,在命令列中輸入 nano math1.c int add int x,int y 2 編譯生成共享庫libmath1.so gcc fpic shared olibmath1.so math1.c 3 建立測試程式testmath.c,在命令...