2009-06-20 11 views
8

'सी', लिनक्स,क्या मुझे स्थैतिक रूप से लिंक करने के लिए स्थिर पुस्तकालयों की आवश्यकता है?

क्या मुझे स्थैतिक रूप से लिंक करने के लिए स्थैतिक पुस्तकालयों की आवश्यकता है, या साझा किए गए मेरे पास पर्याप्त हैं? यदि नहीं, तो क्यों नहीं? (क्या वे एक ही डेटा नहीं रखते हैं?)

उत्तर

10

हां, आपको स्थिर रूप से जुड़े निष्पादन योग्य बनाने के लिए स्थिर पुस्तकालयों की आवश्यकता है।

स्टेटिक पुस्तकालय संकलित वस्तुओं के बंडल हैं। जब आप स्थाई रूप से लाइब्रेरी से लिंक करते हैं, तो यह प्रभावी रूप से उसी लाइब्रेरी के संकलन परिणामों को लेने, उन्हें अपने वर्तमान प्रोजेक्ट में अनपॅक करने और उन्हें उपयोग करने जैसा ही होता है जैसे कि वे आपकी खुद की वस्तुएं हैं।

गतिशील पुस्तकालय पहले से ही जुड़े हुए हैं। इसका मतलब है कि स्थानान्तरण जैसी कुछ जानकारी पहले ही तय की जा चुकी है और बाहर फेंक दी गई है।

इसके अतिरिक्त, गतिशील पुस्तकालयों को स्थिति-स्वतंत्र कोड के रूप में संकलित किया जाना चाहिए। यह स्थैतिक पुस्तकालयों पर प्रतिबंध नहीं है, और कुछ सामान्य प्लेटफ़ॉर्म (जैसे x86) पर प्रदर्शन में महत्वपूर्ण अंतर होता है।

ELF Statifier जैसे उपकरण मौजूद हैं जो डायनेमिकली-लिंक्ड लाइब्रेरी को गतिशील रूप से जुड़े निष्पादन योग्य में बंडल करने का प्रयास करते हैं, लेकिन सभी परिस्थितियों में सही तरीके से काम करने का परिणाम उत्पन्न करना बहुत मुश्किल है।

+1

एक महान उत्तर के लिए धन्यवाद। लेकिन यह इतना मुश्किल क्यों है? –

+2

ईएलएफ स्टेटफियर निष्पादन योग्य और उसके सभी पुस्तकालयों को लोड करता है, फिर प्रक्रिया मेमोरी का एक स्नैपशॉट लेता है। जब आउटपुट छवि चलती है, तो कुछ भी जो स्मृति लेआउट को बदलने के लिए कारण बनता है (उदा। यादृच्छिक वीडीएसओ) के परिणामस्वरूप गलत ऑपरेशन होगा। किसी भी अन्य दृष्टिकोण के लिए गतिशील लिंकर का पुन: आविष्कार करना आवश्यक है। – ephemient

+1

डायनामिक लिंकर को फिर से कार्यान्वित करना मुश्किल क्यों होगा? लाइब्रेरी के आयात और निर्यात के दो टेबल नहीं हैं, जिन्हें स्थानांतरित किया जा सकता है? यह लिंकर है, इसलिए यह पहले से ही एक स्थिर लिंकर लागू कर रहा है, और यह निष्पादन योग्य और गतिशील लाइब्रेरी, आदि के फ़ाइल प्रारूप को जानता है। – ChrisW

6

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

स्थिर और गतिशील पुस्तकालयों में कई कारकों के आधार पर समान जानकारी हो सकती है या नहीं हो सकती है। आपके कोड को स्थिर या गतिशील रूप से लिंक करने का निर्णय एक महत्वपूर्ण है, और अक्सर एप्लिकेशन आर्किटेक्चर को प्रभावित करेगा।

+0

धन्यवाद, 'लिंक' करने के लिए 'संकलित' को सही किया गया। –

2

सभी पुस्तकालय जो आप एक स्थिर रूप से जुड़े प्रोग्राम में लिंक करते हैं, वे स्थिर संस्करण होना चाहिए। जबकि गतिशील (libfoo.so) और स्थिर (libfoo.a) पुस्तकालयों में उनके समान कार्य होते हैं, वे अलग-अलग प्रारूप फ़ाइल होते हैं और इसलिए आपको अपने प्रोग्राम के मिलान प्रकार की आवश्यकता होती है।

1

एक और विकल्प एर्मिन (http://magicErmine.com) यह आंकड़े की तरह है, लेकिन स्मृति यादृच्छिकता से निपटने में सक्षम है।

+0

ग्रेट उत्पाद, धन्यवाद। –

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

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