2012-09-20 91 views
53

我想使用install_name_tool來更改可執行文件的路徑,但我無法弄清楚rpath是什麼。 install_name_tool要求在命令行上給出舊的和新的rpath。我可以使用什麼命令在OSX下打印可執行文件的路徑?在OSX上打印可執行文件的路徑

回答

70

首先,瞭解可執行文件不包含單個rpath條目,而是包含一個或多個條目的數組。

其次,您可以使用otool列出圖像的rpath條目。使用otool -l,你會得到如下的輸出,在最後這都是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) 

外觀爲LC_RPATH命令並注意path條目下的路徑。

+2

有什麼' @ loader_path'? – nn0p

+0

@ nn0p我發現[本文](https://wincent.com/wiki/@executable_path,[email protected][email protected])有助於理解loader_path。 –

+0

我在我的otool中看不到LC_RPATH - l輸出,但是我在LC_ID_DYLIB cmd條目後面的名稱字段下看到安裝名稱 –

1

我目前正在寫幾個猛砸-3腳本處理dyld的,這一次回答了這個問題,所以我將它張貼供參考:

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

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

「希望它可以幫助;-)

NB :有人知道一些可用於此腳本的Bash-3技巧嗎?

-1

我只是用otool命令

otool -L <my executable> 

它打印出的rpath的領域。不需要任何長腳本。

+3

這將打印出使用的共享庫的路徑,但這些路徑可能使用@rpath,但是'otool -L'會不是,在我測試的庫中包含lib自己的LC_RPATH條目 – Baggers

+0

據我所知,otool -L中的第一個路徑是rpath,與otool -D打印的路徑相同 –

1

我發現我可以使用otool -D在OSX上打印共享庫的安裝名稱。

而且,我可以不直接引用通過傳遞-id標誌install_name_tool設置安裝名稱舊安裝名稱:install_name_tool -id「@ rpath的/我的/路徑 MYLIB