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)
共用庫。但是,可能很多人,甚至包括一些高手,對共用庫相關的一些環境變數認識模糊。當然,不知道這些環境變數,也可以用共用庫,但是,若知道它們,可能就會用得更好。下面介紹一些常用的環境變數,希望對家有所協助:
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資料,你可以得到一些該共用庫中函數的使用統計資訊。