2010-11-19 5 views
11

मैं एक प्रणाली "fsimage.so" कि mkdirp, जो सिर्फ libgen.so में रहने के लिए होता है की आवश्यकता है। लेकिन fsimage.so यह नहीं जानता है। उदाहरण के लिए:क्या मैं मौजूदा साझा ऑब्जेक्ट में लाइब्रेरी रेफेंस जोड़ सकता हूं?

# ldd /usr/lib/python2.4/vendor-packages/fsimage.so 
    libfsimage.so.1.0 =>  /usr/lib/libfsimage.so.1.0 
    libxml2.so.2 => /lib/libxml2.so.2 
    libgcc_s.so.1 =>   /usr/sfw/lib/libgcc_s.so.1 
    libpthread.so.1 =>  /lib/libpthread.so.1 
    libz.so.1 =>  /lib/libz.so.1 
    libm.so.2 =>  /lib/libm.so.2 
    libsocket.so.1 =>  /lib/libsocket.so.1 
    libnsl.so.1 => /lib/libnsl.so.1 
    libc.so.1 =>  /lib/libc.so.1 
    libmp.so.2 => /lib/libmp.so.2 
    libmd.so.1 => /lib/libmd.so.1 

# ./test 
Traceback (most recent call last): 
    File "./test", line 26, in ? 
    import fsimage 
ImportError: ld.so.1: isapython2.4: fatal: relocation error: file /usr/lib/python2.4/vendor-packages/fsimage.so: symbol mkdirp: referenced symbol not found 

# LD_PRELOAD=/usr/lib/libgen.so ./test 
Usage: ./test 

स्वाभाविक रूप से, अगर मैं सूत्रों था आदि, मैं बस इसे फिर से लिंक कर सकते हैं, और "-lgen" जोड़ने के लिए, और यह एक निर्भरता के रूप में libgen.so जोड़ देगा।

लेकिन हैकर में एक अभ्यास के रूप में, मेरा कहना है कि मेरे पास कोई स्रोत नहीं है, और बस उस fsimage को जोड़ना चाहता था। इसलिए libgen.so भी लोड करना होगा। Elfedit/objcopy आदि का उपयोग करना, यह संभव नहीं है? मुझे नहीं लगता कि मैं "ld" का उपयोग करने के लिए उपयोग कर सकता हूं। इनपुट के रूप में, और एक नया लिखना। तो अतिरिक्त पुस्तकालय के साथ?

# elfdump /usr/lib/python2.4/vendor-packages/fsimage.so|grep NEEDED 
    [0] NEEDED   0x5187    libfsimage.so.1.0 
    [1] NEEDED   0x5152    libxml2.so.2 
    [2] NEEDED   0x5171    libgcc_s.so.1 

stackoverflow पर पहले प्रयास, मुझ पर आसान जाना :)

उत्तर

10

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

# elfedit libfsimage.so.1.0.0 libfsimage.so.1.0.0-new 
> dyn:value DT_NEEDED 
index tag    value 
    [0] NEEDED   0x4f81    libpthread.so.1 
    [1] NEEDED   0x4fac    libxml2.so.2 
    [2] NEEDED   0x4fc2    libgcc_s.so.1 
> dyn:value -add -s DT_NEEDED libscf.so 
index tag    value 
    [35] NEEDED   0x500d    libscf.so 
> dyn:value DT_NEEDED 
index tag    value 
    [0] NEEDED   0x4f81    libpthread.so.1 
    [1] NEEDED   0x4fac    libxml2.so.2 
    [2] NEEDED   0x4fc2    libgcc_s.so.1 
    [35] NEEDED   0x500d    libscf.so 
> :write 
> :quit 

# ldd libfsimage.so.1.0.0-new 
    libpthread.so.1 =>  /lib/libpthread.so.1 
    libxml2.so.2 => /lib/libxml2.so.2 
    libgcc_s.so.1 =>   /usr/sfw/lib/libgcc_s.so.1 
    libscf.so =>  /lib/libscf.so 
    libz.so.1 =>  /lib/libz.so.1 
    libm.so.2 =>  /lib/libm.so.2 
    libsocket.so.1 =>  /lib/libsocket.so.1 
    libnsl.so.1 => /lib/libnsl.so.1 
    libc.so.1 =>  /lib/libc.so.1 
    libuutil.so.1 =>   /lib/libuutil.so.1 
    libgen.so.1 => /lib/libgen.so.1 
    libnvpair.so.1 =>  /lib/libnvpair.so.1 
    libsmbios.so.1 =>  /usr/lib/libsmbios.so.1 
    libmp.so.2 => /lib/libmp.so.2 
    libmd.so.1 => /lib/libmd.so.1 
+0

मैं elfedit के साथ चलाने के लिए इसलिए मैं पहले तर्क के रूप में संपादित करना चाहता हूं और दूसरे के लिए एक नया नाम और कुछ भी नहीं होता है। मदद दिखाया गया है। मैं लिनक्स पर हूं हालांकि। – kaneda

7

नहीं आसानी से।

अधिकांश UNIX सिस्टम (AIX एक उल्लेखनीय अपवाद है) पर विचार *.so एक "अंतिम" लिंक उत्पाद है, और यह किसी भी आगे की कड़ी के इनपुट के रूप उपयुक्त नहीं है।

fsimage.so के गतिशील खंड में एक नया DT_NEEDED टैग जोड़ने के लिए, आपको इसके .dynamic अनुभाग को फिर से लिखना होगा। .dynamic से किसी प्रविष्टि निकाला जा रहा है अपेक्षाकृत आसान है - तुम सिर्फ "स्लाइड" ऊपर अन्य प्रविष्टियों कर सकते हैं, और DT_NULL साथ अंतिम प्रविष्टि को बदलें।

दूसरी ओर, एक नई प्रविष्टि जोड़ने के लिए आप फ़ाइल में एक नया नया .dynamic अनुभाग जोड़ना चाहते हैं, और फिर नए अनुभाग को इंगित करने के लिए fsimage.so के भीतर सभी पॉइंटर्स (ऑफ़सेट) अपडेट करें। इसके लिए ईएलएफ प्रारूप की "गहरी" समझ की आवश्यकता है।

यह करने के लिए मौजूदा उपकरण, जैसे हैं rpath लेकिन मुझे इसके साथ मिश्रित सफलता मिली है।

+0

मैं जैसे संदिग्ध। मुझे पता है कि सोलारिस ईएलएफ में 512 बाइट्स स्पेस छोड़ देगा, ताकि आप टेक्स्ट इत्यादि जैसे नए अनुभाग आसानी से जोड़ सकें लेकिन DT_NEEDED अनुभागों का विस्तार नहीं (सीधे/आसानी से)। अभी भी दिलचस्प सीखना। अभी के लिए, मैं अपने अजगर को दोबारा जोड़ सकता हूं और पुस्तकालयों को जोड़ सकता हूं, लेकिन 32 बिट बनाम 64 बिट की एक अलग गड़बड़ी दर्ज की। Sigh :) – lundman

1

आप PatchELF का उपयोग कर सकते हैं। रिलीज 0।9 के बाद से 29 फ़र, वर्ष 2016 से बाहर है और आप कर सकते हैं:

  • बदलें गतिशील लोडर निष्पादनयोग्य की ("ELF दुभाषिया")
  • बदलें निष्पादनयोग्य की RPATH और पुस्तकालयों
  • सिकोड़ें की RPATH निष्पादनयोग्य और पुस्तकालयों
  • निकालें घोषित गतिशील पुस्तकालयों पर निर्भरता (DT_NEEDED प्रविष्टियों)
  • एक गतिशील पुस्तकालय पर एक घोषित निर्भरता जोड़ें (DT_NEEDED)
  • एक और एक (DT_NEEDED)
  • एक गतिशील पुस्तकालय

आपके मामले में की SONAME बदलें के साथ एक गतिशील पुस्तकालय पर एक घोषित निर्भरता बदलें:

$ patchelf --add-needed /usr/lib/libgen.so /usr/lib/python2.4/vendor-packages/fsimage.so 
+1

सबसे हालिया स्थिर रिलीज [v0.8] [1] में केवल '--remove-required LIBRARY' है और स्वीकृत संस्करण में लुंडमैन द्वारा बताए गए कारण के लिए शायद नहीं जोड़ा गया है। हालांकि [github में विकास संस्करण] [2] में --add-library विकल्प भी है, इसलिए यह [1] जाने का तरीका हो सकता है: https: //github.com/NixOS/patchelf/blob/0.8 /src/patchelf.cc [2]: https: //github.com/NixOS/patchelf/blob/master/src/patchelf.cc – Davide

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

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