OSX

2012-09-20 22 views
53

'de yürütülebilir dosyanın rpath'ini bastirin install_name_tool'u kullanarak bir yürütülebilir dosyanın rpathini degistirmek istiyorum, ancak rpathin simdi ne oldugunu anlayamıyorum. install_name_tool, hem eski hem de yeni rpath komutlarının komut satırında verilmesini gerektirir. OSX altında bir yürütülebilir dosyanın rpath'ini yazdırmak için hangi komutu kullanabilirim?OSX

cevap

70

Her şeyden önce, bir yürütülebilir dosyanın tek bir rpath girişini içermediğini, ancak bir veya daha fazla giriş dizisi olduğunu anlayın.

İkincisi, bir resmin rpath girişlerini listelemek için otool kullanabilirsiniz. otool -l kullanarak, hangi rpath girişleri olan en sonunda, aşağıdaki gibi çıktıyı alırsınız: LC_RPATH komutlar için

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) 

Bak ve path giriş altında yolunu not edin.

+2

" -ID' @ loader_path'? – nn0p

+0

@ nn0p [this article] (https://wincent.com/wiki/@executable_path,[email protected][email protected]) loader_path'i anlamada yardımcı oldum –

+0

Otoolumda bir LC_RPATH göremedim - l çıktı, ancak LC_ID_DYLIB cmd girişini izleyen ad alanı altındaki yükleme adını görüyorum –

1

Şu anda DYLD işlenmesi için çeşitli Bash-3 komut yazıyorum ve bu bir soru cevaplar, bu yüzden başvuru için post it:

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

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

'o ;-)

NB yardımcı olur umarım : Bu betik için yararlı olabilecek bazı Bash-3 hileleri var mı?

-1

Sadece otool komutunu

otool -L <my executable> 

O rpath alanını yazdırır kullanın. Uzun senaryolara gerek yok.

+3

Bu, kullanılan paylaşılan kitaplıkların yollarını yazdıracaktır. değil, test ettiğim lib'lerde, lib'in kendi LC_RPATH girişini dahil – Baggers

+0

Otoolda ilk yolu söyleyebildiğim kadarıyla -L otoyol -D tarafından basıldığı gibi rpath –

1

Paylaşılan kitaplığın yükleme adını otool-D kullanarak osx'te yazdırabildiğimi buldum.

Üstelik ben install_name_tool için -id bayrağı geçirerek eski yüklemek adına referans olmadan doğrudan yüklemek adını ayarlayabilirsiniz: install_name_tool @ rpath/my/yol MyLib nedir