2012-09-20 18 views
53

पर निष्पादन योग्य के आरपीएथ प्रिंट करें मैं install_name_tool का उपयोग कर निष्पादन योग्य के आरपीएथ को बदलना चाहता हूं, लेकिन मुझे पता नहीं चल रहा है कि आरपीएथ अभी क्या है। install_name_tool को कमांडलाइन पर पुरानी और नई रैपथ दोनों की आवश्यकता होती है। ओएसएक्स के तहत निष्पादन योग्य के आरपीएथ को मुद्रित करने के लिए मैं किस कमांड का उपयोग कर सकता हूं?ओएसएक्स

उत्तर

70

सबसे पहले, समझें कि निष्पादन योग्य में rpath प्रविष्टि नहीं है, लेकिन एक या अधिक प्रविष्टियों की एक सरणी है।

दूसरा, आप otool का उपयोग किसी छवि की rpath प्रविष्टियों को सूचीबद्ध करने के लिए कर सकते हैं। otool -l उपयोग करके, आप जिनमें से rpath प्रविष्टियों अंत में निम्नलिखित की तरह उत्पादन मिलता है, होगी: LC_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) 

देखो और path प्रविष्टि के अंतर्गत पथ को नोट करें।

+2

क्या है' @ loader_path'? – nn0p

+0

@ nn0p मैंने पाया [यह आलेख] (https://wincent.com/wiki/@executable_path,[email protected][email protected]) loader_path को समझने में सहायक। –

+0

मैं अपने ओटोल में एक एलसी_आरपीएटीएच नहीं देख सका - एल आउटपुट, लेकिन मुझे नाम फ़ील्ड के नीचे इंस्टॉल नाम दिखाई देता है जो LC_ID_DYLIB cmd एंट्री –

1

मैं वर्तमान में DYLD के प्रसंस्करण के लिए कई बैश -3 स्क्रिप्ट लिख रहा हूँ और इस एक सवाल का जवाब है, इसलिए मैं संदर्भ के लिए इसे पोस्ट:

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

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

'आशा है कि यह मदद करता है ;-)

एनबी : क्या कोई भी कुछ बैश -3 चाल जानता है जो इस स्क्रिप्ट के लिए उपयोगी हो सकता है?

-1

मैं सिर्फ otool आदेश

otool -L <my executable> 

यह rpath क्षेत्र बाहर प्रिंट का उपयोग करें। किसी भी लंबी लिपियों की कोई ज़रूरत नहीं है।

+3

का पालन करता है, यह साझा लाइब्रेरीज़ के पथों को प्रिंट करेगा। वे पथ @rpath का उपयोग कर सकते हैं हालांकि 'otool -L' करता है नहीं, मैंने जिन libs में परीक्षण किया है, उनमें lib की अपनी LC_RPATH प्रविष्टि – Baggers

+0

शामिल है, जहां तक ​​मैं otool -L में पहला पथ बता सकता हूं, rpath है, जैसा कि otool -D द्वारा मुद्रित है –

1

मुझे पता चला कि मैं otool -D का उपयोग कर ओएसएक्स पर साझा लाइब्रेरी के इंस्टॉल नाम को प्रिंट कर सकता हूं।

इसके अलावा, मैं स्थापित नाम सीधे संदर्भ के बिना पुराने स्थापित नाम के -id झंडा गुजर install_name_tool करने से सेट कर सकते हैं: install_name_tool -id "@ rpath/मेरी/पथ mylib