2012-09-20 16 views
53

Quiero cambiar el rpath de un ejecutable usando install_name_tool, pero no puedo entender qué es el rpath en este momento. install_name_tool requiere que tanto el antiguo como el nuevo rpath se den en la línea de comandos. ¿Qué comando puedo usar para imprimir el rpath de un ejecutable bajo OSX?Imprimir rpath de ejecutable en OSX

Respuesta

70

En primer lugar, entiendo que un archivo ejecutable no contiene una sola entrada rpath, sino una matriz de una o más entradas.

En segundo lugar, puede usar otool para listar las entradas de una imagen rpath. Usando otool -l, obtendrá una salida como la siguiente, al final de las cuales son las entradas rpath:

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) 

buscar la LC_RPATH comandos y tenga en cuenta la vía de acceso en la entrada path.

+2

¿Cuál es la' @ loader_path'? – nn0p

+0

@ nn0p Encontré [este artículo] (https://wincent.com/wiki/@executable_path,[email protected][email protected]) útil para comprender loader_path. –

+0

No pude ver una LC_RPATH en mi otool - l salida, pero veo el nombre de la instalación debajo del campo de nombre que sigue a la entrada del cmd LC_ID_DYLIB –

1

Actualmente estoy escribiendo varios guiones Bash-3 para el procesamiento de dyld y éste responde a la pregunta, así que publicarlo como referencia:

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

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

'Espero que ayuda ;-)

NB : ¿Alguien sabe algunos trucos de Bash-3 que pueden ser útiles para este guión?

-1

sólo tiene que utilizar comandos otool

otool -L <my executable> 

Se imprime el campo rpath. No hay necesidad de ningún script largo.

+3

Esto imprimirá las rutas de acceso de las bibliotecas compartidas utilizadas. Esas rutas pueden usar @rpath sin embargo 'otool -L' no no, en las bibliotecas que probé, incluyen la entrada LC_RPATH propia de la biblioteca – Baggers

+0

Por lo que puedo decir, la primera ruta en otool -L es la ruta, igual que la que imprime otool -D –

1

Descubrí que puedo imprimir el nombre de instalación de una biblioteca compartida en osx usando otool -D.

Por otra parte, puedo establecer el nombre de la instalación directamente sin hacer referencia al nombre antiguo instalar pasando el -id bandera para install_name_tool: install_name_tool -id "@ rpath/mi/ruta mibiblioteca

Cuestiones relacionadas