2012-12-07 37 views
50

मेरे पास पुराना निष्पादन योग्य है जो स्क्रैप ढेर के लिए निर्धारित है, लेकिन यह अभी तक नहीं है। यह कुछ libs पर निर्भर करता है जो मेरे पर्यावरण से हटा दिए गए हैं, लेकिन मेरे पास कुछ जगह है जहां यह ठीक काम करता है। आईडी इस stub libs के लिए निष्पादन योग्य इंगित करना पसंद है। हां, मैं एलडी_LIBRARY_PATH सेट कर सकता हूं, लेकिन इस निष्पादन योग्य को कई स्क्रिप्ट से बुलाया जाता है, और कई उपयोगकर्ता और मुझे इसे एक स्थान पर ठीक करना अच्छा लगेगा।क्या मैं पहले से संकलित बाइनरी में 'rpath' बदल सकता हूं?

मेरे पास इसके लिए स्रोत नहीं है, और इसे प्राप्त करना मुश्किल होगा। मैं सोच रहा था - क्या मैं एक ईएलएफ जागरूक संपादक का उपयोग करके इस फ़ाइल को संपादित कर सकता हूं, और इसे नए libs को हिट करने के लिए rpath को एक सरल पाथ जोड़ सकता हूं? क्या यह संभव है, या एक बार जब आप ईएलएफ बाइनरी बनाते हैं, तो आप चीजों को स्थानों पर ठीक करते हैं और उन्हें स्थानांतरित नहीं किया जा सकता है?

+3

एक shellscript कि LD_LIBRARY_PATH सेट और बाइनरी कॉल में लपेटें। शेल स्क्रिप्ट को कॉलर्स के पथ में मौजूद किसी स्थान पर रखें। – wildplasser

+0

एलडी_LIBRARY_PATH बाल प्रक्रियाओं द्वारा विरासत में मिला है। आप शायद यह नहीं चाहते हैं। – Will

+1

@ हाँ हाँ और मैंने पहले ही कहा है कि मैं ऐसा नहीं करना चाहता हूं। ': :) –

उत्तर

52

chrpath नामक एक उपकरण है जो यह कर सकता है - यह संभवतः आपके वितरण के पैकेज में उपलब्ध है।

+0

जाहिर है मैं इस उपकरण के बारे, धन्यवाद बहुत –

+6

बस एक मैक उपयोगकर्ताओं के लिए टिप्पणी में पता नहीं था,' install_name_tool' इस '-rpath' झंडा –

+1

साथ आप त्रुटि मिलती है क्या कर सकते हैं कोई rpath या runpath टैग मिला। ', आप इसे बदलने के लिए' chrpath' का उपयोग नहीं कर सकते हैं, लेकिन आप इस मामले में 'patchelf' का उपयोग कर सकते हैं:' patchelf --set-rpath/path/to/libaries ' – phyatt

94

chrpath से अधिक सार्वभौमिक उपकरण है patchelf कहा जाता है। यह मूल रूप से निक्स और निक्सोस (पैकेजिंग सिस्टम और एक जीएनयू/लिनक्स वितरण) के लिए पैकेज बनाने में उपयोग के लिए बनाया गया था।

chrpath -r '$ORIGIN/../lib64' rdsamp 
rdsamp: no rpath or runpath tag found. 

दूसरी ओर,

patchelf --set-rpath '$ORIGIN/../lib64' rdsamp 

ठीक सफल होता है:

मामले में वहाँ एक द्विआधारी (यहाँ बुलाया rdsamp) में कोई rpath, chrpath विफल रहता है।

+6

विशेष रूप से, 'patchelf' है एक बाइनरी में एक rpath जोड़ने में सक्षम है जिसमें rpath नहीं है, फिर भी - जहां 'chrpath' केवल पहले से मौजूद प्रविष्टि को संशोधित करने में सक्षम है। – maxschlepzig

+2

एक सामान्य नोट के रूप में, 'rpath' और' runpath' के बीच सूक्ष्म भेद को समझना उचित है। असल में, कोई 'LD_LIBRARY_PATH' ओवरराइड कर सकता है और दूसरा नहीं कर सकता है। विवरण के लिए, http://blog.tremily.us/posts/rpath/ –

+2

देखें कष्टप्रद बात यह है कि 'chrpath' और' patchelf 'दोनों अपनी शब्दावली के साथ मैला हैं। उदाहरण के लिए, ऊपर दिखाया गया 'patchelf' कमांड' रनपाथ 'को बदल देगा, लेकिन' rpath' नहीं होगा जबतक कि आप '--force-rpath' विकल्प भी प्रदान न करें। –

0

यह मेरे लिए काम किया, XORIGIN $ ORIGIN के साथ बदल दिया।

chrpath -r '\$\ORIGIN/../lib64' httpd

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^