2010-05-07 11 views
5

मेरे पास एक सी ++ प्रोग्राम है जो रनटाइम पर लिंक करता है, कहें, mylib.so। फिर, वही प्रोग्राम myplugin.so से एक फ़ंक्शन लोड करने के लिए dlopen()/dlsym() का उपयोग करता है, गतिशील लाइब्रेरी जो बदले में mylib.so पर निर्भरता रखती है।रनटाइम लिंकिंग लाइब्रेरी ग्लोबल्स हैं जो ड्लोपेन से भरे प्लगइन के बीच साझा किए गए हैं?

मेरा प्रश्न है: क्या प्रोग्राम और प्लगइन में फ़ंक्शन प्रोग्राम के लिए आरक्षित उसी स्मृति क्षेत्र में mydlib.so में परिभाषित एक ही ग्लोबल्स तक पहुंच जाएगा, या प्रत्येक को अपनी मेमोरी स्पेस में अलग, असंबद्ध प्रतियां असाइन की जाएंगी ? यदि उत्तरार्द्ध डिफ़ॉल्ट व्यवहार है, तो क्या इसे बदलना संभव है?

अग्रिम धन्यवाद =)!

उत्तर

1

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

[संपादित करें]: ऐसा करने का दूसरा कारण यह है कि यदि आप ऐसे मंच पर कमजोर लिंकिंग अनुकरण कर रहे हैं जो इसका समर्थन नहीं करता है। यह मेरी सूची में से एक जैसा है, सिवाय इसके कि यह मुख्य कार्यक्रम है जो .so की तुलना में गतिशील लाइब्रेरी द्वारा निर्यात किए गए एपीआई से एसपीआई का निर्माण कर रहा है, इसे स्टार्टअप पर स्पष्ट रूप से निर्यात करना। यह वास्तव में दूसरा सबसे अच्छा है, लेकिन आप जो चाहते हैं उसके साथ आप जो चाहते हैं उसके साथ करते हैं (ठीक है, जब तक आप किसी प्रकार की कनेक्शन लाइब्रेरी लिखकर काम करने के लिए तैयार नहीं होते)। स्वच्छ API/SPI का उपयोग करने के लिए

+0

+1 – neuro