我有一個命令行工具,我使用Xcode構建,鏈接到一些Apple框架。作爲一個「個人實驗」(試圖瞭解一點動態庫的工作原理),我試圖將可執行文件指向不同版本的相同框架。Mac OS X - 將可執行文件鏈接到不同的動態庫,加載舊的和新的
比方說,例如,該可執行EXEC使用LIB_A,後者利用LIB_B的。
我做了兩個LIB_A和LIB_B將它們放置在不同的(較短)的目錄路徑的副本。我使用otool -L
來獲得庫的依賴關係和標識符。
然後我用install_name_tool
與指令-id
改變的新LIB_A和LIB_B IDS(基本上只是改變作爲名稱最主要的路徑沒有改變)。
然後用指令-change
我讓新LIB_A指向新LIB_B,並讓可執行EXEC指向新LIB_A。
這樣,我想,整個依賴樹應該已被正確地重新創建。
install_name_tool
沒有與otool
它們都指向正確的路徑返回錯誤,檢查可執行文件和新庫。
不幸的是運行可執行文件EXEC許多錯誤都引發到控制檯有關類的重複定義。就像舊圖書館和新圖書館都裝載了一樣。
最後一切都崩潰與跟蹤/ BPT陷阱:5
例如:
objc[25992]: Class NSAppleEventManager is implemented in both
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation and
/xyz/Foundation.
One of the two will be used. Which one is undefined.
如果我調用
export DYLD_PRINT_LIBRARIES=1
我在執行看到實際庫被加載兩次。