8

पर पोर्टेबल मालिकाना ईएलएफ बाइनरी बनाने के लिए मैं मौजूदा मालिकाना ईएलएफ-बाइनरी बनाने के लिए एक रास्ता तलाश रहा हूं, जो सिस्टम पुस्तकालयों, पोर्टेबल के विशिष्ट संस्करणों के खिलाफ जुड़े हुए हैं। पोर्टेबल के साथ मेरा मतलब है कि प्रत्येक सिस्टम पर एक ही प्रोसेसर आर्किटेक्चर और एक संगत सिस्टम कर्नेल के साथ निष्पादन योग्य कार्य करना, पुस्तकालयों के स्रोत कोड के बिना (अगर स्रोत कोड के बिना कोई रास्ता नहीं है, तो यह भी ठीक होगा) ।लिनक्स

अब तक मैं दो संभावनाएं के बारे में सोचा है, लेकिन मैं अगर वे सब पर संभव हो रहे हैं पता नहीं है और अगर हां, जो चयन करने के लिए:

  1. सभी जुड़े पुस्तकालयों और उनकी निर्भरता सर्च कर रहे हैं और उन्हें एक में शामिल द्विआधारी की उपनिर्देशिका और उस निर्देशिका में लाइब्रेरी-पथ को बदलना।
  2. बाइनरी फ़ाइल में स्थिर रूप से पुस्तकालयों को एक बड़े निष्पादन योग्य (यदि प्रोग्राम स्वयं को चेकसम के आधार पर सत्यापित नहीं करता है) में रिलिकिंक करना।

लाइसेंसिंग कोई समस्या नहीं है क्योंकि मैं बनाए गए पोर्टेबल प्रोग्राम वितरित नहीं करना चाहता, यह केवल निजी उपयोग के लिए है।

आपके उत्तरों के लिए धन्यवाद।

+0

http://stackoverflow.com/questions/2157636 | http://stackoverflow.com/questions/16250831 | http://stackoverflow.com/questions/15386027 –

उत्तर

6

सभी लिंक किए गए पुस्तकालयों और उनकी निर्भरताओं को खोजना और उन्हें बाइनरी की उपनिर्देशिका में शामिल करना और उस निर्देशिका में लाइब्रेरी-पथ को बदलना शामिल है।

यह सबसे साझा पुस्तकालयों के लिए काम करेंगे, लेकिन libc.so.6 लिए काम नहीं करेगा (जो एक सबसे यदि आपका लक्ष्य प्रणाली नई पर्याप्त संस्करण नहीं है समस्याओं देने की संभावना है)।

कारण: ग्लिब में 200 से अधिक अलग साझा पुस्तकालय शामिल हैं, जिनमें उनके बीच अनियमित बाइनरी इंटरफेस हैं, और उनके बीच एक स्थिर एबीआई नहीं है। इस वजह से, सभी ग्लिब के कुछ हिस्सों को एक ही निर्माण से आना चाहिए। इन भागों में से एक libc.so.6 है। दूसरा ld-linux.so है। उत्तरार्द्ध के लिए एक पूर्ण पथ हार्ड गतिशील प्रत्येक गतिशील निष्पादन योग्य में है। अंतिम परिणाम: यदि आप libc.so.6 की अपनी प्रतिलिपि की आपूर्ति करते हैं, और यदि वह प्रति सिस्टम /lib/ld-linux*.so.2 से मेल नहीं खाती है, तो आपको बहुत अजीब क्रैश दिखाई देगा, जो आपको समझाने या डिबग करने के लिए बहुत कठिन समय लगेगा।

पुस्तकालयों को स्थिर रूप से बाइनरी फ़ाइल में एक बड़े निष्पादन योग्य में रिलिकिंक करना।

कि AIX अलावा अन्य किसी भी यूनिक्स प्रणाली पर काम नहीं कर सकते हैं: वे सब a.out पर विचार करने और foo.soअंतिम लिंक उत्पाद है, जो किसी भी आगे नहीं जोड़ा जा सकता हो।

statifier मौजूद है, जो गतिशील एक से बाहर (विशाल) स्थिर निष्पादन योग्य बनाता है। मुझे इसका उपयोग करने का कोई अनुभव नहीं है।

+0

आपके विस्तृत उत्तर के लिए धन्यवाद। मैं स्टेटिफायर को आज बाद में कोशिश करूंगा (जीएमटी + 1) और देखें कि क्या यह किसी भी तरह से मेरी मदद कर सकता है। – FSMaxB

+0

स्टेटिफायर उस अच्छी तरह से काम नहीं कर रहा है और दूसरा सॉफ़्टवेयर जो मुझे अपना लक्ष्य (ermine) प्राप्त करने में मदद कर सकता है वह स्वामित्व है। लेकिन कम से कम मेरे पास क्या हासिल करने का एक तरीका है। – FSMaxB

+0

मैंने एर्मिन की कोशिश की और यह ठीक काम करने के लिए (परीक्षण संस्करण का उपयोग कर) – FSMaxB