我想使用install_name_tool
來更改可執行文件的路徑,但我無法弄清楚rpath是什麼。 install_name_tool
要求在命令行上給出舊的和新的rpath。我可以使用什麼命令在OSX下打印可執行文件的路徑?在OSX上打印可執行文件的路徑
回答
首先,瞭解可執行文件不包含單個rpath
條目,而是包含一個或多個條目的數組。
其次,您可以使用otool
列出圖像的rpath
條目。使用otool -l
,你會得到如下的輸出,在最後這都是rpath
條目:
Load command 34
cmd LC_LOAD_DYLIB
cmdsize 88
name /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (offset 24)
time stamp 2 Wed Dec 31 19:00:02 1969
current version 1038.32.0
compatibility version 45.0.0
Load command 35
cmd LC_RPATH
cmdsize 40
path @loader_path/../Frameworks (offset 12)
外觀爲LC_RPATH
命令並注意path
條目下的路徑。
我目前正在寫幾個猛砸-3腳本處理dyld的,這一次回答了這個問題,所以我將它張貼供參考:
#! /bin/bash
# ######################################################################### #
if [ ${#} -eq 0 ]
then
echo "
Usage: ${0##*/} FILE...
List rpaths in FILEs
"
exit 0
fi
# ######################################################################### #
shopt -s extglob
# ######################################################################### #
for file in "${@}"
do
if [ ! -r "${file}" ]
then
echo "${file}: no such file" 1>&2
continue
fi
if ! [[ "$(/usr/bin/file "${file}")" =~ ^${file}:\ *Mach-O\ .*$ ]]
then
echo "${file}: is not an object file" 1>&2
continue
fi
if [ ${#} -gt 1 ]
then
echo "${file}:"
fi
IFS_save="${IFS}"
IFS=$'\n'
_next_path_is_rpath=
while read line
do
case "${line}" in
*(\)cmd\ LC_RPATH)
_next_path_is_rpath=yes
;;
*(\)path\ *\ \(offset\ +([0-9])\))
if [ -z "${_next_path_is_rpath}" ]
then
continue
fi
line="${line#* path }"
line="${line% (offset *}"
if [ ${#} -gt 1 ]
then
line=$'\t'"${line}"
fi
echo "${line}"
_next_path_is_rpath=
;;
esac
done < <(/usr/bin/otool -l "${file}")
IFS="${IFS_save}"
done
# ######################################################################### #
「希望它可以幫助;-)
NB :有人知道一些可用於此腳本的Bash-3技巧嗎?
我只是用otool命令
otool -L <my executable>
它打印出的rpath的領域。不需要任何長腳本。
這將打印出使用的共享庫的路徑,但這些路徑可能使用@rpath,但是'otool -L'會不是,在我測試的庫中包含lib自己的LC_RPATH條目 – Baggers
據我所知,otool -L中的第一個路徑是rpath,與otool -D打印的路徑相同 –
我發現我可以使用otool -D在OSX上打印共享庫的安裝名稱。
而且,我可以不直接引用通過傳遞-id標誌install_name_tool設置安裝名稱舊安裝名稱:install_name_tool -id「@ rpath的/我的/路徑 MYLIB
- 1. xcode:在路徑上沒有可啓動的可執行文件
- 2. 可執行文件的路徑
- 3. 在grunt中打印出文件路徑
- 4. 可執行文件找不到路徑
- 5. Ruby popen和可執行文件路徑?
- 6. NativeProcessStartupInfo可執行文件,絕對路徑
- 7. 打印圖像文件的路徑
- 8. python:檢查一個可執行文件是否在路徑上?
- 9. 可執行路徑
- 10. OSX/Clang版本的__progname獲取絕對路徑的可執行文件?
- 11. HAXE(hxcpp) - 相對於可執行文件路徑路徑
- 12. 在Stata中執行文件的路徑
- 13. 可否在我的路徑中查找可執行文件?
- 14. 從虛擬路徑打印pdf文件
- 15. 使用bash打印文件路徑
- 16. 在Mac OSX上打印Firemonkey
- 17. 可執行文件的Java文件路徑中的空格
- 18. 打印txt文件的校驗和不打印的文件路徑
- 19. 獲取主可執行文件.jar文件的目錄路徑
- 20. 查找可執行文件是否在路徑中可用
- 21. 在OSX上加載/執行ELF文件的可能性
- 22. 打印getcwd路徑
- 23. 打印樹路徑
- 24. 在Linux中的Python錯誤的可執行文件路徑
- 25. mac osx上的lib路徑
- 26. 在vim中查找可執行文件的路徑
- 27. 在可執行文件中編譯的單位路徑
- 28. 不在路徑中的可執行文件 - GO
- 29. 打印執行的PHP代碼(代碼路徑)
- 30. Unix可執行文件無法在MAC OSX中執行
有什麼' @ loader_path'? – nn0p
@ nn0p我發現[本文](https://wincent.com/wiki/@executable_path,[email protected][email protected])有助於理解loader_path。 –
我在我的otool中看不到LC_RPATH - l輸出,但是我在LC_ID_DYLIB cmd條目後面的名稱字段下看到安裝名稱 –