2009-08-17 15 views
6

मेरे पास एक ऐसा प्रोग्राम है जो प्लगइन सिस्टम को कुछ प्लगइन_नाम.एसओ (सामान्य रूप से) से गतिशील रूप से लोड करके कार्यान्वित करता है।जीसीसी/लिनक्स: एक स्थिर पुस्तकालय को .so में जोड़ना?

लेकिन बदले में मेरे पास एक स्थिर "सहायक" लाइब्रेरी है (इसे इसे हेल्पर.ए कहते हैं) जिनके कार्यों का उपयोग मुख्य कार्यक्रम और प्लगइन में मुख्य कार्य दोनों से किया जाता है। उन्हें किसी भी तरह से इंटर-ऑपरेट करने की ज़रूरत नहीं है, वे टेक्स्ट मैनिपुलेशन के लिए केवल सहायक कार्य हैं।

यह प्रोग्राम, एक बार शुरू हुआ, पुनः लोड या पुनरारंभ नहीं किया जा सकता है, इसलिए मैं मुख्य कार्यक्रम से नहीं, प्लगइन से नई "सहायक" कार्यक्षमता प्राप्त करने की उम्मीद कर रहा हूं।

तो मेरी खोज है .. क्या मुख्य कार्यक्रम की तुलना में "सहायक" के एक अलग (शायद नए) संस्करण का उपयोग करने के लिए एसएसओ में "प्लगइन फ़ंक्शन कोड" को मजबूर करना संभव है?

यह कैसे किया जा सकता है? शायद plugically_name.so पर स्थिर रूप से जोड़ने या अन्यथा helper.a जोड़कर?

+0

मैं यह जोड़ना चाहता हूं कि मैं मुख्य प्रोग्राम से नई सहायक लाइब्रेरी का उपयोग नहीं करना चाहता हूं या उम्मीद करता हूं .. मैं बस एक नई/बेहतर सहायक लाइब्रेरी के साथ प्रत्येक नई प्लगइन को लिंक करना चाहता हूं। – conejoroy

+0

क्या कोई कारण है कि आप सहायक फ़ंक्शन के लिए डायनामिक लिंकिंग का उपयोग क्यों नहीं कर सकते? –

+0

एक बार शुरू हुआ, मुख्य प्रोग्राम निष्पादन को रोक नहीं सकता है, यहां तक ​​कि एक नया सहायक भी पुनः लोड करने के लिए .. और प्रोग्राम को केवल बहुत ही बुनियादी सहायक कार्यक्षमता की आवश्यकता है क्योंकि यह प्लगइन के लिए केवल प्लेसहोल्डर है। इसलिए यदि मैं एक नई/बेहतर या विस्तारित सहायक लाइब्रेरी है तो मैं पूरी प्लगइन को फिर से संकलित करना पसंद करता हूं। मुझे लगता है कि दो से भी एक .so (प्लगइन) वितरित करना अधिक व्यावहारिक है। इसलिए (प्लगइन और प्लगइन का उपयोग करने वाला सबसे अद्यतित सहायक) – conejoroy

उत्तर

6

निक मेयर का जवाब विंडोज और एईक्स पर सही है, लेकिन डिफ़ॉल्ट रूप से हर दूसरे यूनिक्स प्लेटफ़ॉर्म पर सही होने की संभावना नहीं है।

सबसे यूनिक्स प्लेटफार्मों पर, क्रम लोडर सभी प्रतीकों के लिए एक एकल नाम अंतरिक्ष को बनाए रखता है, इसलिए यदि आप plugin.so में a.out में foo_helper परिभाषित करते हैं, और यह भी, और फिर या तो से foo_helper, पहली परिभाषा दिखाई फोन क्रम को लोडर (आमतौर पर a.out से) दोनों कॉल के लिए डिफ़ॉल्ट रूप से उपयोग किया जाता है।

इसके अलावा, चित्र तथ्य यह है कि foo_helpera.out से निर्यात नहीं किया जा सकता है (और इस प्रकार क्रम लोडर के लिए अदृश्य हो सकता है) द्वारा कुछ अन्य साझा लाइब्रेरी संदर्भ यह जटिल है, जब तक आप -rdynamic ध्वज का उपयोग करें, या। दूसरे शब्दों में, चीजें दिखाई देने के लिए निक के रूप में काम करने के लिए दिखाई दे सकती हैं, फिर आप a.out लिंक लाइन पर एक साझा लाइब्रेरी जोड़ते हैं, और वे अब इस तरह से काम नहीं करते हैं।

ईएलएफ प्लेटफ़ॉर्म (जैसे लिनक्स) पर, आपके पास प्रतीक दृश्यता और बाध्यकारी पर बहुत अधिक नियंत्रण है। -fvisibility=hidden और -rdynamicGCC मैन पेज में और लिंकर मैन पेज में -Bsymbolic का विवरण देखें।

अधिकांश अन्य यूनिक्स प्लेटफ़ॉर्म के पास प्रतीक बाइंडिंग को नियंत्रित करने का कोई तरीका है, लेकिन यह आवश्यक रूप से प्लेटफ़ॉर्म-विशिष्ट है।

1

यदि आपका मुख्य कार्यक्रम और गतिशील लाइब्रेरी दोनों स्थिर रूप से सहायक है। तो, आपको helper.a के मिश्रण संस्करणों के बारे में चिंता करने की आवश्यकता नहीं है (जब तक आप सहायक में आवंटित पास पॉइंटर्स जैसी चीजें नहीं करते .exe और .so सीमाओं के बीच .a)।

हेल्पर.ए से आवश्यक कोड वास्तविक बाइनरी में डाला जाता है जब आप इसके खिलाफ लिंक करते हैं। तो जब आप .exe से helper.a में कॉल करते हैं, तो आप अपनी निष्पादन योग्य छवि के कोड सेगमेंट से कोड निष्पादित करेंगे, और जब आप .so से helper.a में कॉल करेंगे, तो आप कोड के भाग से कोड निष्पादित करेंगे पता स्थान जहां .so लोड किया गया था। यहां तक ​​कि यदि आप एक ही फ़ंक्शन को हेल्पर.ए के अंदर बुला रहे हैं, तो आप उस फ़ंक्शन के दो अलग-अलग 'उदाहरण' को कॉल कर रहे हैं, इस पर निर्भर करता है कि कॉल .exe या .so से बनाया गया था या नहीं।

+0

मैं देखता हूं। लेकिन मैं libhelper.a में कोड को संकलित करने के लिए प्लगइन में कैसे जोड़ सकता हूं? प्लगइन संकलित करते समय मुझे "gcc -lhelper.a -static" जैसे कुछ निर्दिष्ट करना चाहिए? – conejoroy

+0

यदि आपकी लाइब्रेरी libhelper.a है, तो plug-comp संकलन करते समय gcc के लिए pass -L * dir * -lhelper पास करें। इसलिए, जहां * dir * libhelper.a का पथ है। जब आप स्थिर पुस्तकालय बना रहे हों तो इसका उपयोग करने की आवश्यकता नहीं है। –

+0

यह उत्तर केवल सीमित स्थितियों के तहत सही है, जो नहीं कहा गया है। –

0

मुझे लगता है कि यह प्रश्न आपके जैसा ही है।How to force symbols from a static library to be included in a shared library build?

- व्हाहोल-संग्रह लिंकर विकल्प यह करना चाहिए। आप इसका इस्तेमाल उदाहरण के रूप में करेंगे

जीसीसी -ओ libmyshared.so foo.o -lanothersharedlib -Wl, - पूरे संग्रह -lmystaticlib

और यह मेरे लिए काम करता है।

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