2012-09-20 7 views
53

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

70

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.

+2

Was ist' @ loader_path? – nn0p

+0

@ nn0p Ich fand [diesen Artikel] (https://wincent.com/wiki/@executable_path,[email protected][email protected]) hilfreich beim Verständnis von loader_path. –

+0

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 –

1

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?

-1

benutze ich nur otool Befehl

otool -L <my executable> 

Es druckt das rpath Feld. Keine Notwendigkeit für lange Skripte.

+3

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

+0

Soweit ich das feststellen kann, ist der erste Pfad in otool -L der rpath, wie auch von otool -D –

1

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