2012-09-20 23 views
53

Desidero modificare il percorso di un file eseguibile utilizzando install_name_tool, ma non riesco a capire quale sia il percorso in questo momento. install_name_tool richiede sia il vecchio che il nuovo percorso da fornire sulla riga di comando. Quale comando posso usare per stampare il percorso di un eseguibile sotto OSX?Stampa percorso dell'eseguibile su OSX

risposta

70

Prima di tutto, capire che un file eseguibile non contiene una singola voce rpath, ma una matrice di una o più voci.

In secondo luogo, è possibile utilizzare otool per elencare le voci di rpath di un'immagine. Utilizzando otool -l, si otterrà in uscita come il seguente, proprio alla fine della quale sono i rpath voci:

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) 

Cerca gli comandi LC_RPATH e annotare il percorso sotto la voce path.

+2

Qual è il' @ loader_path'? – nn0p

+0

@ nn0p Ho trovato [questo articolo] (https://wincent.com/wiki/@executable_path,[email protected][email protected]) utile per capire loader_path. –

+0

Non riuscivo a vedere un LC_RPATH nel mio otool - l output, ma vedo il nome di installazione sotto il campo name che segue la voce cmd LC_ID_DYLIB –

1

Attualmente sto scrivendo diversi script Bash-3 per la lavorazione dyld e questo risponde alla domanda, in modo da inviare per riferimenti:

#! /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 

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

'Speranza che aiuta ;-)

NB : Qualcuno sa qualche trucco di Bash-3 che può essere utile per questo script?

-1

mi basta usare il comando otool

otool -L <my executable> 

Esso stampa il campo rPath. Non c'è bisogno di script lunghi.

+3

Questo stamperà i percorsi delle librerie condivise utilizzate.Questi percorsi possono usare @rpath tuttavia 'otool -L' non non, nelle librerie che ho testato, includo la voce LC_RPATH della stessa – Baggers

+0

Per quanto ne so il primo percorso in otool -L è il percorso, come stampato da otool -D –

1

Ho scoperto che posso stampare il nome di installazione di una libreria condivisa su osx utilizzando otool -D.

Inoltre, è possibile impostare il nome installare direttamente senza riferimento al vecchio nome di installazione passando la bandiera -id a install_name_tool: install_name_tool -id "@ rpath/mio/percorso mylib