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

2021-04-02 17:31:51 字數 2162 閱讀 5791

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

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

libsdisplay library search paths

relocdisplay relocation processing

filesdisplay progress for input file

symbolsdisplay symbol table processing

bindingsdisplay information about symbol binding

versionsdisplay version dependencies

allall previous options combined

statisticsdisplay relocation statistics

unuseddetermined unused dsos

helpdisplay 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,在命令...