rpath增添依賴庫搜尋路徑
【原文:http://www.myexception.cn/other/681660.html】
rpath新增依賴庫搜尋路徑
Linux 上動態庫搜尋順序:
Unless loading object has RUNPATH:RPATH of the loading object,
then the RPATH of its loader (unless it has a RUNPATH), ...,
until the end of the chain, which is either the executable
or an object loaded by dlopen(loader 為可執行程式或被 dlopen 開啟的物件)
Unless executable has RUNPATH:
RPATH of the executable
LD_LIBRARY_PATH
RUNPATH of the loading object
ld.so.cache
default dirs
rpath 用法
ld:-rpath dir or --rpath=dir
為了相容其他 ELF 連結器,如果 -R 選項的值是個目錄而不是檔案,那麼此時相當與 -rpath注:-R filename 與 --just-symbols=filename 等價
如果連結時沒使用 '-rpath' ,那麼如果定義了 LD_RUN_PATH 就會使用該值作為 rpath
ld 如果不是直接被呼叫的,而是是通過一個驅動程式如 gcc 呼叫,那麼的所有的連結選項都需要加上字首 "-Wl,", 選項和值之間用","隔開
所以gcc的rpath用法:
-Wl,-rpath,dir
多個dir之間用冒號分隔:
-Wl,-rpath,dir1:dir2:...:dirN
$ORIGING
代表程式目錄,需要加單引號,否則會被解釋為變數ORIGIN的值。這樣gcc的連結flags為-Wl,-rpath,'$ORIGIN'
或'-Wl,-rpath,$ORIGIN'
用 readelf 檢視編譯後的程式
readelf -d path
會發現多了類似與這麼一行0x0000000f (RPATH) Library rpath: [$ORIGIN]
這樣,程式執行前會先搜尋程式所在路徑有沒有依賴的庫。
Makefile 中的寫法:
注意Makefile裡要用兩個$$,只用一個$會展開成變數值,$$相當與轉義成$LFLAGS += '-Wl,-rpath,$$dir'
qmake 工程中的寫法:
QMAKE_LFLAGS += -Wl,-rpath,\'\$\$dir\'
或QMAKE_RPATHDIR += :\'\$\$dir\'
注意QMAKE_RPATHDIR最開始要加冒號,因為生成Makefile會自動在前面加上-Wl,-rpath,$$PWDbash 裡執行 make 命令:
make LDFLAGS="'-Wl,-R,\$\$ORIGIN'"
其他有待調查的問題
1. ld -z -origin 或 g++ -Wl,-z,origin不知道這個有什麼作用,文件裡一筆帶過沒看明白。readelf 看了下多了類似與如下的一行
0x6ffffffb (FLAGS_1) Flags: ORIGIN
2. macx
@executable_path : relative to the main executable
@loader_path : relative to the referring binary
@rpath : relative to any of a list of paths.
from qtcreator/src/rpath.pri:
!isEmpty(TIGER_COMPAT_MODE) {
QMAKE_LFLAGS_SONAME = -Wl,-install_name,@executable_path/../PlugIns/
} else {
QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/PlugIns/
QMAKE_LFLAGS += -Wl,-rpath,@loader_path,-rpath,@executable_path
}
使用 otool 檢視
3. clang
4. RUNPATH, DT_RUNPATH
參考文獻:
http://itee.uq.edu.au/~daniel/using_origin/http://stackoverflow.com/questions/9263256/can-you-please-help-me-understand-how-mach-o-libraries-work-in-mac-os-x
http://itee.uq.edu.au/~daniel/using_origin/
http://stackoverflow.com/questions/6324131/rpath-origin-not-having-desired-effect
http://www.delorie.com/gnu/docs/binutils/ld_3.html
http://labs.qt.nokia.com/2011/10/28/rpath-and-runpath/
http://blog.csdn.net/dbzhang800/article/details/6918413
相關文章
- 在Idea 內搜尋新增Maven 依賴IdeaMaven
- 檢視gcc搜尋路徑GC
- Linux執行時動態庫搜尋路徑優先順序Linux
- linux編譯時和執行時,庫搜尋路徑和順序Linux編譯
- 執行期載入時共享庫路徑搜尋優先順序實驗
- 共享庫連結和載入時的路徑搜尋優先順序
- 給你安利一款魯班大叔開發的maven依賴搜尋神器Maven
- maven-search一款魯班大叔開發的maven依賴搜尋神器Maven
- 編譯期連結時共享庫搜尋路徑優先順序實驗編譯
- 搜車 React Native 依賴管理方案React Native
- Google 能擺脫路徑依賴,不只做一個廣告公司麼?Go
- 不要依賴Mock庫 - ErwinMock
- <摘錄>Linux下動態共享庫載入時的搜尋路徑詳解Linux
- 從“路徑依賴”談ERP實施的阻力及策略(上)(轉)
- 從“路徑依賴”談ERP實施的阻力及策略(下)(轉)
- [python]python環境變數以及模組搜尋路徑Python變數
- Windows XP 增加可執行檔案的搜尋路徑(轉)Windows
- 第7節 蒙卡模擬計算路徑依賴型期權價格
- 27.8萬臺iPhone 8 Plus從鄭州發貨,但富士康正尋求擺脫蘋果路徑依賴之道iPhone蘋果
- 依賴管理和依賴範圍
- 尋路之 A* 搜尋演算法演算法
- 泛企業搜尋PK網際網路搜尋
- 依賴
- [KubernetesClient | 底層依賴庫]client
- 使用 Swift Package Manager 整合依賴庫SwiftPackage
- 【資料庫之函式依賴】資料庫函式
- 比酒量問題與二叉樹搜尋和路徑問題二叉樹
- 依賴倒置(DIP)與依賴注入(DI)依賴注入
- Golang 依賴注入設計哲學|12.6K 🌟 的依賴注入庫 wireGolang依賴注入
- Maven依賴管理:控制依賴的傳遞Maven
- Maven依賴範圍及依賴傳遞Maven
- 如何發現Python依賴庫漏洞Python
- Android studio 匯入依賴庫Android
- 快取依賴(檔案、資料庫)快取資料庫
- 動態庫遞迴依賴專項遞迴
- AI依賴算力,而算力依賴能源AI
- linux下C/C++編譯時系統搜尋 include 和 連結庫 檔案路徑的指定LinuxC++編譯
- 以圖搜尋——網際網路影象搜尋引擎的“雞肋”?