पर निष्पादन योग्य के आरपीएथ प्रिंट करें मैं install_name_tool
का उपयोग कर निष्पादन योग्य के आरपीएथ को बदलना चाहता हूं, लेकिन मुझे पता नहीं चल रहा है कि आरपीएथ अभी क्या है। install_name_tool
को कमांडलाइन पर पुरानी और नई रैपथ दोनों की आवश्यकता होती है। ओएसएक्स के तहत निष्पादन योग्य के आरपीएथ को मुद्रित करने के लिए मैं किस कमांड का उपयोग कर सकता हूं?ओएसएक्स
ओएसएक्स
उत्तर
सबसे पहले, समझें कि निष्पादन योग्य में 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
प्रविष्टि के अंतर्गत पथ को नोट करें।
मैं वर्तमान में 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 चाल जानता है जो इस स्क्रिप्ट के लिए उपयोगी हो सकता है?
मैं सिर्फ otool आदेश
otool -L <my executable>
यह rpath क्षेत्र बाहर प्रिंट का उपयोग करें। किसी भी लंबी लिपियों की कोई ज़रूरत नहीं है।
का पालन करता है, यह साझा लाइब्रेरीज़ के पथों को प्रिंट करेगा। वे पथ @rpath का उपयोग कर सकते हैं हालांकि 'otool -L' करता है नहीं, मैंने जिन libs में परीक्षण किया है, उनमें lib की अपनी LC_RPATH प्रविष्टि – Baggers
शामिल है, जहां तक मैं otool -L में पहला पथ बता सकता हूं, rpath है, जैसा कि otool -D द्वारा मुद्रित है –
मुझे पता चला कि मैं otool -D का उपयोग कर ओएसएक्स पर साझा लाइब्रेरी के इंस्टॉल नाम को प्रिंट कर सकता हूं।
इसके अलावा, मैं स्थापित नाम सीधे संदर्भ के बिना पुराने स्थापित नाम के -id झंडा गुजर install_name_tool करने से सेट कर सकते हैं: install_name_tool -id "@ rpath/मेरी/पथ mylib
क्या है' @ loader_path'? – nn0p
@ nn0p मैंने पाया [यह आलेख] (https://wincent.com/wiki/@executable_path,[email protected][email protected]) loader_path को समझने में सहायक। –
मैं अपने ओटोल में एक एलसी_आरपीएटीएच नहीं देख सका - एल आउटपुट, लेकिन मुझे नाम फ़ील्ड के नीचे इंस्टॉल नाम दिखाई देता है जो LC_ID_DYLIB cmd एंट्री –