क्या लिनक्स पर वर्तमान rpath का निरीक्षण करने का एक तरीका है?


83

मुझे पता है कि readelf -d <elf> | grep RPATHशेल से दिए गए बाइनरी का निरीक्षण करना संभव है, लेकिन क्या एक प्रक्रिया के भीतर ऐसा करना संभव है?

कुछ इस तरह (मेरी पूरी तरह से सिस्टम कॉल):

  /* get a copy of current rpath into buffer */
  sys_get_current_rpath(&buffer);

मैं हमारे कोडबेस में कुछ संदिग्ध SO लिंकिंग मुद्दों का निदान करने की कोशिश कर रहा हूं, और यदि संभव हो तो RPATH का निरीक्षण करना चाहता हूं (मुझे नहीं बल्कि एक बाहरी स्क्रिप्ट को स्पॉन करना होगा)।


1
ध्यान रखें कि साझा लाइब्रेरी समस्याओं का निदान करते समय आपको RUNPATH टैग का भी निरीक्षण करना चाहिए। इस प्रकार आपको grep PATHइसके बजाय करना चाहिए । यह लिंकर पर निर्भर है कि क्या RPATH या RUNPATH का उपयोग किया जाता है, और दोनों के बीच सूक्ष्म लेकिन महत्वपूर्ण अंतर हैं: stackoverflow.com/a/52020177
निकोलस कैपेंन

जवाबों:


54

1
यह शानदार है, लेकिन यह $ ORIGIN के साथ काम नहीं करता है। $ ORIGIN की व्याख्या नहीं की गई है, और फ़ंक्शन के अनुसार वापस आ गया है। क्या $ ORIGIN व्याख्या को जोड़ने का कोई तरीका है?
Jérôme

5
@ Jérôme यदि आप एक ऐसे वातावरण में निष्पादित कर रहे हैं /proc, जहां माउंट किया गया है, तो विस्तार $ORIGINउतना ही सरल है जितना readlink("/proc/self/exe", ...)कि अंतिम स्लैश में एनयूएल-टर्मिनेट।
रूसी रूसी

जबकि सवाल विशेष रूप से था RPATH, मैं यह नोट करना चाहूंगा कि DT_RUNPATHटैग की जांच करना उतना ही महत्वपूर्ण है अगर कोई यह जानना चाहता है कि बाइनरी अपने साझा पुस्तकालयों को लोड कर रहा है या नहीं।
निकोलस कैपेंन

155

रिकॉर्ड के लिए, यहां कुछ कमांड दिए गए हैं जो rpathहेडर दिखाएंगे ।

objdump -x binary-or-library |grep RPATH

शायद यह करने के लिए एक और भी बेहतर तरीका निम्नलिखित है:

readelf -d binary-or-library |head -20

दूसरे आदेश में अन्य पुस्तकालयों पर प्रत्यक्ष निर्भरता को भी सूचीबद्ध किया गया है rpath


7
Ubuntu 15.04 पर मुझे उपयोग करना है: objdump -x बाइनरी-या-लाइब्रेरी | grep RUNPATH
एंड्रियास रोथ


11
इस उत्तर का उस प्रश्न से कोई लेना- देना नहीं है, जो (और प्रश्न में ही निहित है)।
नियोजित रूसी


1

शेल फ़ंक्शन के रूप में यहां मैं सुविधा के लिए उपयोग कर रहा हूं:

function getrpath {
    eu-readelf -d "${1:?}" | sed -e '/RUNPATH/{s~.*\[\(.*\)\]~\1~;n};d'
}

इस तरह eu-readelfसे उत्पादन की खपत elfutils:

Type              Value
NEEDED            Shared library: [libpq.so.5]
NEEDED            Shared library: [libc.so.6]
RUNPATH           Library runpath: [/some/path/to/lib]
....

और उत्सर्जन करता है

 /some/path/to/lib

यह readelfएल्फुटिल्स के बजाय बिनुतिल के साथ ठीक काम करना चाहिए eu-readelf

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.