linux क्या मैं पहले से संकलित बाइनरी में 'rpath' को बदल सकता हूं?




linker elf (3)

मेरे पास एक पुराना निष्पादन योग्य है जो स्क्रैप हीप के लिए निर्धारित है, लेकिन यह अभी तक नहीं है। यह मेरे पर्यावरण से हटाए गए कुछ कामों पर निर्भर करता है, लेकिन मेरे पास कुछ ऐसे स्थान हैं जहां यह ठीक काम करता है। आईडी इन स्टेबल लिबास के लिए इस निष्पादन योग्य को इंगित करना पसंद करता है। हां, मैं LD_LIBRARY_PATH सेट कर सकता हूं, लेकिन यह निष्पादन योग्य कई स्क्रिप्ट्स, और कई उपयोगकर्ताओं से कॉल किया जाता है और मैं इसे एक स्थान पर ठीक करना पसंद करूंगा।

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


इसने मेरे लिए काम किया, $ ORIGIN के साथ XORIGIN की जगह।

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


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

यदि बाइनरी में कोई रैपाथ नहीं होता है (जिसे chrpath कहा जाता है), chrpath विफल रहता है:

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

दूसरी ओर,

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

सफल ठीक है।


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





elf