Я хочу изменить rpath исполняемого файла с помощью install_name_tool
, но я не могу понять, что такое rpath прямо сейчас. install_name_tool
требуется как старая, так и новая rpath для передачи в командной строке. Какую команду я могу использовать для печати rpath исполняемого файла в OSX?
Печать rpath исполняемого файла в OSX
Ответ 1
Прежде всего, поймите, что исполняемый файл не содержит единственную запись 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
.
Ответ 2
В настоящее время я пишу несколько сценариев Bash -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, которые могут быть полезны для этого script?
Ответ 3
Я обнаружил, что могу напечатать имя установки общей библиотеки osx с помощью otool -D.
Кроме того, я могу установить имя установки непосредственно без ссылки на старое имя установки, передав флаг -id в install_name_tool: install_name_tool -id "@rpath/my/path mylib
Ответ 4
Я просто использую команду otool
otool -L <my executable>
Он выводит поле rpath. Нет необходимости в каких-либо длинных сценариях.