Druckpfad einer ausführbaren Datei unter macOS

73

Ich möchte den Pfad einer ausführbaren Datei mit ändern install_name_tool, kann aber nicht herausfinden, was der Pfad gerade ist. install_name_toolerfordert, dass sowohl der alte als auch der neue Pfad in der Befehlszeile angegeben werden. Mit welchem Befehl kann ich den Pfad einer ausführbaren Datei unter macOS drucken ?

statisch schwimmen
quelle

Antworten:

95

Verstehen Sie zunächst, dass eine ausführbare Datei keinen einzelnen rpathEintrag enthält, sondern ein Array aus einem oder mehreren Einträgen.

Zweitens können Sie otooldie rpathEinträge eines Bildes auflisten. Wenn otool -lSie verwenden, erhalten Sie die folgende Ausgabe, ganz am Ende befinden sich die rpathEinträ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)

Suchen Sie nach den LC_RPATHBefehlen und notieren Sie den Pfad unter dem pathEintrag.

NSGod
quelle
8
Was ist das @loader_path?
nn0p
3
@ nn0p Ich fand diesen Artikel hilfreich, um loader_path zu verstehen.
Kevin Olree
1
Ich konnte kein LC_RPATH in meiner otool -l-Ausgabe sehen, aber ich sehe den Installationsnamen unter dem Namensfeld, das auf den Cmd-Eintrag LC_ID_DYLIB folgt
Amos Joshua
9

Sie können verwenden otool -l myexecutable, aber dies druckt viele unnötige Informationen, wenn Sie nur an der Liste der Pfade interessiert sind .

Sie können die Ausgabe des Filters otool -lan die entsprechenden rpath Einträge von

otool -l myexecutable | grep RPATH -A2
Plasmacel
quelle
5

Ich habe festgestellt, dass ich den Installationsnamen einer gemeinsam genutzten Bibliothek unter macOS mit drucken kann

otool -D mylib

Darüber hinaus kann ich den Installationsnamen direkt ohne Bezugnahme auf den alten Installationsnamen festlegen, indem ich das -idFlag an Folgendes übergebe install_name_tool:

install_name_tool -id @rpath/my/path mylib
Amos Joshua
quelle
2

Ich schreibe derzeit mehrere Bash-3-Skripte für die Verarbeitung von DYLD und dieses beantwortet die Frage, daher 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

# ######################################################################### #

'ich hoffe es hilft ;-)

NB: Kennt jemand einige Bash-3-Tricks, die für dieses Skript nützlich sein können?

Fravadona
quelle
-1

Ich benutze nur den Befehl otool

otool -l <my executable>

Es druckt das Pfadfeld aus. Keine langen Skripte erforderlich.

Rosenwasser
quelle