Ld-linux.so हैक्स के साथ वैकल्पिक libc का उपयोग करना; क्लीनर विधि?


13

मेरे पास बहुत पुराने ग्लिब के साथ एक विरासत प्रणाली है, जिसे हम परीक्षण / सत्यापन कार्य के एक पहाड़ के चक्कर के बिना अपग्रेड नहीं कर सकते हैं।

मुझे उस सिस्टम पर अब कई बार नए प्रोग्राम (जैसे जावा 1.7) चलाने की आवश्यकता है। मैंने एक चेरोट समाधान का विकल्प चुना, जहां मैं सभी आवश्यक कामों को पैकेज करता हूं, और एक सेवा को चेरोट में चलाता हूं।

चेरोट हालांकि बहुत सीमित है, और मैं इसके बजाय LD_LIBRARY_PATH के साथ समस्या को हल करने की कोशिश करूंगा। दुर्भाग्य से, libc.so.6: cannot handle TLS dataजब मैं कोशिश करता हूं कि मुझे एक त्रुटि मिलती है।

यह पता चला है कि मुझे /lib/ld-linux.so.2चुरोट से भी जरूरत है । यह काम:

LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program

हालांकि, यह निर्धारित करने के लिए javaनिरीक्षण करके मेरी चाल को /proc/self/cmdlineविफल करता है कि अपने पुस्तकालयों को कहां से लोड करना है, जो विफल हो जाता है यदि बाइनरी का नाम 'बिन / लावा' नहीं था। इसके अलावा जावा स्टार्टअप के दौरान खुद को क्रियान्वित करता है, आगे चलकर मामलों को जटिल बनाता है।

इस काम को करने के लिए एक अंतिम-खाई प्रयास में, मैंने हेक्स संपादक के साथ जावा बाइनरी को खोला और स्ट्रिंग /lib/ld-linux.so.2को प्रतिस्थापित किया /home/chroot/ld.so(और इसे एक सिमलिंक बना दिया ld-linux.so.2), और यह काम कर गया!

लेकिन मुझे लगता है कि हर कोई इस बात से सहमत होगा कि प्रत्येक नए बाइनरी के रास्ते को फिर से शुरू करने के लिए एक बड़े पैमाने पर कीचड़ है।

क्या कोई कस्टम ld-linux.so सहित कस्टम लाइब्रेरी पथ का उपयोग करने के लिए एक क्लीनर तरीका जानता है ?

जवाबों:


12

लोडर के लिए पथ बाइनरी में संकलित है जैसा कि आपने अपने हेक्स संपादक के साथ खोजा था। आप वास्तव में भाग्यशाली है कि बाइनरी संपादन सीधे दोनों क्योंकि काम किया /lib/ld-linux.so.2और /home/chroot/ld.soएक ही लंबाई हैं। उन तारों की लंबाई भी द्विआधारी में होती है और यदि आप सीधे तार को संशोधित करते हैं तो आप सूक्ष्म समस्याएं पैदा कर सकते हैं।

यदि आप अंत में मार्ग को जा रहे हैं तो आपको दुभाषिया को अद्यतन करने के लिए किसी चीज़ पर नज़र डालनी चाहिए । यह आपको स्थायी रूप से दुभाषिया को जल्दी और सुरक्षित रूप से बदलने देगा।


किस्मत नहीं थी, मुझे पता था कि मुझे बाइट्स में से किसी को भी स्थानांतरित करने की आवश्यकता नहीं है;; लेकिन, patchelf जैसा चाहती है वैसा ही दिखता है। एक रिश्तेदार पथ का उपयोग करने में सक्षम नहीं होने के बावजूद, यह LD_LIBRARY_PATH का उपयोग कर सकता हूं, ताकि मुझे एक आवरण की आवश्यकता न हो। जैसे ही मुझे इसका परीक्षण करने का मौका मिलेगा, मैं आपको जवाब का श्रेय दूंगा।
प्रातः

1
यह काम करता हैं! यह मुझे इस सर्वर पर पुराने- libc प्रोग्रामों के साथ नए-libc प्रोग्राम्स को मिलाने के लिए एक अच्छा रास्ता देगा। भविष्य के पाठकों के लिए, कमांड था patchelf --set-interpreter $JAVA/lib/ld-linux.so.2 --set-rpath $JAVA/lib:$JAVA/lib/i386:$JAVA/lib/i386/jli $JAVA/bin/java, जहां $ JAVA JRE की निर्देशिका है, और जहां मैंने सभी आश्रित पुस्तकालयों को गोल कर दिया था और उन्हें lib/JRE की निर्देशिका में डाल दिया था ।
डलनेस

@dataless अच्छी तरह से मुझे अभी भी इस libjvm.so को हल करने के लिए LD_LIBRARY_PATH की आवश्यकता है, क्योंकि libstdc ++। so.6: साझा की गई ऑब्जेक्ट फ़ाइल नहीं खोल सकता है: ऐसी कोई फ़ाइल या निर्देशिका [रूट @ 97245bb7cc1 टेंसरफ़्लो-जावा] #
Amos

@Amos यह एक समय हो गया है, लेकिन मेरे मामले के लिए मुझे अब LD_LIBRARY_PATH की आवश्यकता नहीं थी क्योंकि डिफ़ॉल्ट जावा बाइनरी से आता है। लेकिन, उस हिस्से पर ध्यान दें जहां मैंने कहा था कि मैंने चारों ओर घूमकर जावा द्वारा उपयोग किए गए सभी परिवादों को पाया और उन्हें जावा लिबिर डायर में कॉपी किया। मैं ldd $JAVA/bin/javaआईएसटी प्राप्त करता था। कुछ डायनेमिक लिबास भी होते हैं जिनकी आपको जरूरत होती है जैसे libnss.so
डॅटलैस 8'18
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.