Ich möchte den rpath einer ausführbaren Datei mit install_name_tool
ändern, aber ich kann nicht herausfinden, was der rpath jetzt ist. install_name_tool
erfordert, dass der alte und der neue rpath auf der Kommandozeile angegeben werden. Welchen Befehl kann ich verwenden, um den rpath einer ausführbaren Datei unter OSX zu drucken?Print rpath der ausführbaren Datei auf OSX
Antwort
Zunächst einmal verstehen, dass eine ausführbare Datei keinen einzigen rpath
Eintrag enthält, sondern ein Array mit einem oder mehreren Einträgen.
Zweitens können Sie otool
verwenden, um die rpath
Einträge eines Bildes aufzulisten. Mit otool -l
, werden Sie eine Ausgabe wie die folgende bekommen, am Ende von denen die rpath
Einträge:
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)
Achten Sie auf die LC_RPATH
Befehle und notieren Sie den Pfad unter dem path
Eintrag.
Ich bin derzeit mehrere Bash-3-Skripte für die Verarbeitung von dyld und diese beantwortet die Frage zu schreiben, so poste ich es als Referenz:
#! /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
# ######################################################################### #
‚hoffen, dass es ;-)
NB hilft : Kennt jemand einige Bash-3-Tricks, die für dieses Skript nützlich sein können?
benutze ich nur otool Befehl
otool -L <my executable>
Es druckt das rpath Feld. Keine Notwendigkeit für lange Skripte.
Dadurch werden die Pfade der verwendeten gemeinsamen Bibliotheken ausgedruckt Diese Pfade können @rpath verwenden, jedoch tut 'otool-L' das Nicht, in den Bibliotheken, die ich getestet habe, habe ich den eigenen LC_RPATH-Eintrag der Bibliothek eingefügt. – Baggers
Soweit ich das feststellen kann, ist der erste Pfad in otool -L der rpath, wie auch von otool -D –
Ich habe festgestellt, dass ich den Installationsnamen einer gemeinsam genutzten Bibliothek auf OSX mit otool -D drucken kann.
Außerdem kann ich den Namen direkt an den alten installiert Namen ohne Bezug installieren gesetzt, indem man die -id Flagge install_name_tool: install_name_tool -id „@ rpath/my/path mylib
Was ist' @ loader_path? – nn0p
@ nn0p Ich fand [diesen Artikel] (https://wincent.com/wiki/@executable_path,[email protected][email protected]) hilfreich beim Verständnis von loader_path. –
Ich konnte einen LC_RPATH in meinem otool nicht sehen - Ich gebe den Installationsnamen unter dem Namensfeld aus, das dem LC_ID_DYLIB-cmd-Eintrag folgt –