किसी दिए गए निष्पादन योग्य के लिए लिंक की गई लाइब्रेरी बदलना (सेंटो 6)


29

मेरे पास एक निष्पादन योग्य इस तरह से जुड़ा हुआ है:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

जहाँ libcrypto और libssl लाइब्रेरी खुलते हैं। 1.0.0-fips libs। मैं इसके बजाय 1.0.1 पुस्तकालयों के साथ प्रयोग करना चाहता हूं, और इसलिए मैंने उन्हें अपने घर निर्देशिका में बनाया है। क्या a.outदर्द के बिना मेरी नई खुलने वाली लाइब्रेरी के खिलाफ राहत पाने का एक तरीका है ? मैं बचना चाहूंगा

  • Relink होने a.out(क्योंकि निर्माण उपकरण बड़े जटिल हैं)
  • किसी भी वैश्विक सेटिंग को बदलना (क्योंकि अन्य देव इस मशीन पर काम करते हैं)

क्या यह संभव है कि मैं यहाँ क्या कर रहा हूँ?

जवाबों:


22

आप इस विशेष निष्पादन के लिए एक अलग पुस्तकालय को अस्थायी रूप से स्थानापन्न कर सकते हैं। लिनक्स में, पर्यावरण चर LD_LIBRARY_PATH निर्देशिकाओं का एक बृहदान्त्र-अलग-अलग सेट है जहाँ निर्देशिकाओं के मानक सेट से पहले पुस्तकालयों को पहले खोजा जाना चाहिए; यह तब उपयोगी होता है जब किसी नए पुस्तकालय में डिबगिंग या विशेष उद्देश्यों के लिए गैर-मानक लाइब्रेरी का उपयोग किया जाता है। पर्यावरण चर LD_PRELOAD उन कार्यों के साथ साझा पुस्तकालयों को सूचीबद्ध करता है जो मानक सेट को ओवरराइड करते हैं, जैसे /etc/ld.so.preload करता है। - साझा पुस्तकालय

आप सीधे लोडर का भी चालान कर सकते हैं:

/lib/ld-linux.so.2 - नियम-पथ path executable


1
LD_LIBRARY_PATH डिफ़ॉल्ट खोज पथ को ओवरराइड नहीं करता है। मैंने इसे सेट किया है, लेकिन ldd अभी भी मुझे सिस्टम डिफ़ॉल्ट पथ दिखाता है, ओवरराइड नहीं। हालांकि मैं LD_PRELOAD सेट करके अपनी खुद की लाइब्रेरी लोड करने के लिए बाध्य कर सकता हूं।
कैलेमरियम

18

एक आवरण स्क्रिप्ट लिखें जो LD_LIBRARY_PATHपर्यावरण चर सेट करता है। यह PATHसाझा पुस्तकालयों के लिए लटकन है । सिस्टम खोज पथ हमेशा सूचीबद्ध निर्देशिकाओं के बाद खोजा जाता है $LD_LIBRARY_PATH। संदर्भ के लिए गतिशील लिंकर मैनुअल देखें ।

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

या, एक-बंद के लिए, सीधे कमांड लाइन पर:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

वैकल्पिक रूप से, यदि आप बाइनरी को संशोधित करना चाहते हैं, तो chrpath का प्रयास करें , जो आपको निष्पादन में पके हुए लाइब्रेरी खोज पथ को संपादित करने देता है।


2
के लिए +1 chrpath। बिल्कुल वही जो मुझे चाहिए था।
राघव RV

प्यारा कहानी, माइक्रोसॉफ्ट भी इस googling 2 मिनट खर्च करने के लिए बेवकूफ है और नहीं बल्कि स्पष्ट रूप openss-1.0.0 के लिए एसक्यूएल सर्वर से लिंक करने या openssl.so के संस्करण के लिए फिर कंपाइल से उपयोग LD_LIBRARY_PATH हर किसी को सलाह दे रहा है blogs.msdn.microsoft.com/sql_server_team /…
इवान कैरोल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.