6.查看可執行文件的依賴庫
ldd命令可以查看一個可執行程序依賴的共享庫,
# ldd./main
linux-gate.so.1=> (0x00ec1000)
libtest.so=> ./libtest.so (0x00967000)
libc.so.6=> /lib/tls/i686/cmov/libc.so.6 (0x0025b000)
/lib/ld-linux.so.2(0x00471000)
7.可執行程序定位共享庫
當系統加載可執行代碼時候,能夠知道其所依賴的庫的名字,但是還需要知道絕對路徑
此時就需要系統動態載入器(dynamiclinker/loader)對於elf格式的可執行程序,是由ld-linux.so*來完成的,它先後搜索
elf文件的DT_RPATH段,
LD_LIBRARY_PATH指定的路徑,
/etc/ld.so.cache文件列表,
/lib/,/usr/lib,目錄
找到庫文件後將其載入內存。
8.指定庫路徑
如果安裝在/lib或者/usr/lib下,那麼ld默認能夠找到。
方法1
如果安裝在其他目錄,需要將其添加到/etc/ld.so.cache文件中,步驟如下
編輯/etc/ld.so.conf文件,加入庫文件所在目錄的路徑
運行ldconfig,該命令會重建/etc/ld.so.cache文件
方法2:(臨時指定)
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/libpath
9.庫的題外話
庫文件在連接(靜態庫和共享庫)和運行(僅限於使用共享庫的程序)時被使用,其搜索路徑是在系統中進行設置的。一般Linux系統把 /lib和 /usr/lib兩個目錄作為默認的庫搜索路徑,所以使用這兩個目錄中的庫時不需要進行設置搜索路徑即可直接使用。對於處於默認庫搜索路徑之外的庫,需要將庫的位置添加到庫的搜索路徑之中。設置庫文件的搜索路徑有下列兩種方式:
在環境變量 LD_LIBRARY_PATH中指明庫的搜索路徑。
在 /etc/ld.so.conf文件中添加庫的搜索路徑。
將自己可能存放庫文件的路徑都加入到/etc/ld.so.conf
添加方法也極其簡單,將庫文件的絕對路徑直接寫進去就OK,一行一個。例如:
/usr/local/lib
/opt/lib
我的機是Ubuntu10.4系統/etc/ld.so.conf的內容如下:
#cat/etc/ld.so.conf
include/etc/ld.so.conf.d/*.conf
為了加快程序執行時對共享庫的定位速度,避免使用搜索路徑查找共享庫的低效率,linux是直接讀取庫列表文件/etc/ld.so.cache從中進行搜索的。
/etc/ld.so.cache是一個非文本的數據文件,不能直接編輯,它是根據/etc/ld.so.conf中設置的搜索路徑由/sbin/ldconfig命令將這些搜索路徑下的共享庫文件集中在一起而生成的。
因此,為了保證程序執行時對庫的定位,在/etc/ld.so.conf中進行了庫搜索路徑的設置之後,還必須要運行/sbin/ldconfig命令更新/etc/ld.so.cache 文件之後才可以。
ldconfig,簡單的說,它的作用就是將/etc/ld.so.conf列出的路徑下的庫文件緩存到/etc/ld.so.cache以供使用。因此當安裝完一些庫文件,(例如剛安裝好glib),或者修改ld.so.conf增加新的庫路徑後,需要運行一下/sbin/ldconfig使所有的庫文件都被緩存到ld.so.cache中,如果沒做,即使庫文件明明就在/usr/lib下的,也是不會被使用的,結果編譯過程中抱錯,缺少xxx庫。
在程序連接時(不是運行),對於庫文件(靜態庫和共享庫)的搜索路徑,除了上面的設置方式之外,還可以通過-L參數顯式指定。因為用-L設置的路徑將被優先搜索,所以在連接的時候通常都會以這種方式直接指定要連接的庫的路徑。