文章目錄
程序動態庫的搜索路徑
程序運行時所需的動態庫的搜索路徑
- ELF可執行文件中動態段DT_RPATH指定;gcc加入鏈接參數“-Wl,-rpath”指定動態庫搜索路徑;
- 環境變量LD_LIBRARY_PATH指定路徑;(多用於臨時指定)
LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的兩個環境變量,二者的含義和作用分別如下:
- LIBRARY_PATH環境變量用於在程序編譯期間查找動態鏈接庫時指定查找共享庫的路徑,例如,指定gcc編譯需要用到的動態鏈接庫的目錄.
- LD_LIBRARY_PATH環境變量用於在程序加載運行期間查找動態鏈接庫時指定除了系統默認路徑之外的其他路徑,注意,LD_LIBRARY_PATH中指定的路徑會在系統默認路徑之前進行查找。
- /etc/ld.so.cache中緩存的動態庫路徑。可以通過修改配置文件/etc/ld.so.conf 增刪路徑(修改後需要運行ldconfig命令);
linux下的共享庫機制採用了類似於高速緩存的機制,將庫信息保存在/etc/ld.so.cache裏邊。程序連接的時候首先從這個文件裏邊查找
ldconfig是一個動態鏈接庫管理命令,其用途來生成/etc/ld.so.cache. 生成過程如下:
在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如前介紹,lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件,緩存文件默認爲 /etc/ld.so.cache.
程序編譯時搜索的路徑
- gcc -L 指定的目錄
- gcc的環境變量LIBRARY_PATH
- 編譯gcc時寫在程序內的內定目錄例如:/lib/:/usr/lib/:/usr/lib/x86_64-linux-gnu/7/…
gcc的選項-print-search-dirs,會顯示顯示編譯器的搜索路徑,其中 libraries 選項就是上面所說的動態庫搜索路徑。
查看動態連接庫的相關命令
- ldconfig
通常在系統啓動時運行,而當用戶安裝了一個新的動態鏈接庫時,就需要手工運行這個命令.
常用命令 ldconfig -p //打印出ld.so.cache緩存中的動態鏈接庫
- ldd
ldd不是一個可執行程序,而只是一個shell腳本
ldd能夠顯示可執行模塊的dependency,其原理是通過設置一系列的環境變量例如:LD_TRACE_LOADED_OBJECTS,將其設置爲1,在運行會顯示模塊的dependency,而程序並不真正執行。(本質是通過ld-linux.so(elf動態庫的裝載器)來實現的.
- nm用來查看.so庫中的函數名字
動態庫的常見問題
1./usr/bin/ld: cannot find -lxxx
解決:
- 查看前文提到的搜索目錄下是否有libxxx.so動態庫。
- 如果有名稱對不對,不對可以符號連接ln -sv過去。
- 如果還不對,就是版本不匹配,下載相應的版本。
2. /usr/bin/ld: skipping incompatible
解決:
- sudo apt-get install gcc-X-multilib //X是gcc對應的版本