我想使用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条目后面的名称字段下看到安装名称 –