मेरे पास बहुत पुराने ग्लिब के साथ एक विरासत प्रणाली है, जिसे हम परीक्षण / सत्यापन कार्य के एक पहाड़ के चक्कर के बिना अपग्रेड नहीं कर सकते हैं।
मुझे उस सिस्टम पर अब कई बार नए प्रोग्राम (जैसे जावा 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 सहित कस्टम लाइब्रेरी पथ का उपयोग करने के लिए एक क्लीनर तरीका जानता है ?