2012-09-20 6 views
53

Chcę zmienić ścieżkę dostępu do pliku wykonywalnego przy użyciu install_name_tool, ale nie wiem, czym jest teraz ścieżka rpath. install_name_tool wymaga podania zarówno starej, jak i nowej ścieżki rpath w linii poleceń. Jakiej komendy użyć do wydrukowania ścieżki rpath pliku wykonywalnego pod OSX?Drukuj ścieżkę do pliku wykonywalnego na OSX

Odpowiedz

70

Przede wszystkim należy zrozumieć, że plik wykonywalny nie zawiera pojedynczego wpisu rpath, ale tablicę zawierającą jeden lub więcej wpisów.

Po drugie, można użyć pozycji otool, aby wyświetlić wpisy obrazu rpath. Korzystanie otool -l, dostaniesz wyjście jak poniżej, na samym końcu którego są rpath wpisów:

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) 

szukać poleceń LC_RPATH i zanotować ścieżkę pod wpisem path.

+2

Jaki jest' @ loader_path'? – nn0p

+0

@ nn0p Znalazłem [ten artykuł] (https://wincent.com/wiki/@executable_path,[email protected]_path_and_rpath) pomocne w zrozumieniu ścieżki loader_path –

+0

Nie widziałem LC_RPATH w moim otworze - l wynik, ale widzę nazwę instalacji pod polem nazwy, która następuje po LC_ID_DYLIB cmd wpis –

1

Obecnie piszę kilka Bash-3 skrypty do przetwarzania dyld a ten odpowiada na pytanie, więc dodawać je do odniesienia:

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

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

„nadzieję, że pomoże ;-)

NB : Czy ktoś zna jakieś sztuczki Bash-3, które mogą być przydatne dla tego skryptu?

-1

wystarczy użyć otool polecenie

otool -L <my executable> 

To wypisuje pole rpath. Nie potrzeba żadnych długich skryptów.

+3

To wydrukuje ścieżki użytych bibliotek współdzielonych.Te ścieżki mogą korzystać z @rpath, jednak 'otool -L' ma nie, w testowanych przeze mnie bibliotekach uwzględniono własny wpis biblioteki LC_RPATH – Baggers

+0

O ile mogę powiedzieć, że pierwsza ścieżka w otool -L jest ścieżką rpath, taką samą, jak jest drukowana przez otool -D –

1

Znalazłem, że mogę wydrukować nazwę instalacji biblioteki współużytkowanej na osx przy użyciu otool -D.

Co więcej, mogę ustawić nazwę zainstalować bezpośrednio bez odniesienia do starej nazwy zainstalować przekazując flagę -id do install_name_tool: install_name_tool -id „@ rpath/my/path myLib