Chcę zmienić ścieżkę dostępu do pliku wykonywalnego przy użyciu install_name_tool
, ale nie wiem, czym jest teraz ścieżka rpath. install_name_tool
wymaga podania zarówno starej, jak i nowej ścieżki rpath w linii poleceń. Jakiej komendy użyć do wydrukowania ścieżki rpath pliku wykonywalnego pod OSX?Drukuj ścieżkę do pliku wykonywalnego na OSX
Odpowiedz
Przede wszystkim należy zrozumieć, że plik wykonywalny nie zawiera pojedynczego wpisu rpath
, ale tablicę zawierającą jeden lub więcej wpisów.
Po drugie, można użyć pozycji otool
, aby wyświetlić wpisy obrazu rpath
. Korzystanie otool -l
, dostaniesz wyjście jak poniżej, na samym końcu którego są rpath
wpisów:
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)
szukać poleceń LC_RPATH
i zanotować ścieżkę pod wpisem path
.
Obecnie piszę kilka Bash-3 skrypty do przetwarzania dyld a ten odpowiada na pytanie, więc dodawać je do odniesienia:
#! /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
# ######################################################################### #
„nadzieję, że pomoże ;-)
NB : Czy ktoś zna jakieś sztuczki Bash-3, które mogą być przydatne dla tego skryptu?
wystarczy użyć otool polecenie
otool -L <my executable>
To wypisuje pole rpath. Nie potrzeba żadnych długich skryptów.
To wydrukuje ścieżki użytych bibliotek współdzielonych.Te ścieżki mogą korzystać z @rpath, jednak 'otool -L' ma nie, w testowanych przeze mnie bibliotekach uwzględniono własny wpis biblioteki LC_RPATH – Baggers
O ile mogę powiedzieć, że pierwsza ścieżka w otool -L jest ścieżką rpath, taką samą, jak jest drukowana przez otool -D –
Znalazłem, że mogę wydrukować nazwę instalacji biblioteki współużytkowanej na osx przy użyciu otool -D.
Co więcej, mogę ustawić nazwę zainstalować bezpośrednio bez odniesienia do starej nazwy zainstalować przekazując flagę -id do install_name_tool: install_name_tool -id „@ rpath/my/path myLib
Jaki jest' @ loader_path'? – nn0p
@ nn0p Znalazłem [ten artykuł] (https://wincent.com/wiki/@executable_path,[email protected]_path_and_rpath) pomocne w zrozumieniu ścieżki loader_path –
Nie widziałem LC_RPATH w moim otworze - l wynik, ale widzę nazwę instalacji pod polem nazwy, która następuje po LC_ID_DYLIB cmd wpis –