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