2011-08-31 13 views
10

मैं एक साझा ऑब्जेक्ट लाइब्रेरी बनाने की कोशिश कर रहा हूं जिसे dlopen() का उपयोग करके प्रोग्राम द्वारा खोला जाएगा। यह लाइब्रेरी एक अलग पुस्तकालय द्वारा प्रदान की गई कार्यक्षमता का उपयोग करेगी जो स्थैतिक है।साझा लाइब्रेरी निर्माण में शामिल करने के लिए एक स्थिर लाइब्रेरी से प्रतीकों को कैसे बल देना है?

गतिशील एक को जोड़ने के दौरान मैंने स्थिर लाइब्रेरी को खींचने के लिए लिंक लाइन पर उचित ध्वज शामिल किया है (उदा। मेरे पास libfoo.a के लिए -lfoo है), और लिंकर शिकायत नहीं करता है। हालांकि, जब मुख्य प्रोग्राम गतिशील लाइब्रेरी पर dlopen() को कॉल करता है, तो कॉल स्थिर पुस्तकालय से एक प्रतीक का संदर्भ देने वाले "अपरिभाषित प्रतीक" संदेश के साथ विफल रहता है।

रनिंग एनएम इंगित करता है कि प्रश्न में प्रतीक गतिशील पुस्तकालय में अपरिभाषित है, और मुख्य कार्यक्रम में यह शामिल नहीं है, तो मैं इस प्रतीक को खींचने के लिए लिंकर को कैसे मजबूर कर सकता हूं? प्रतीक स्वयं अनियमित डेटा खंड में है (एनएम आउटपुट में प्रतीक प्रकार "बी")।

उत्तर

14

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

gcc -o libmyshared.so foo.o -lanothersharedlib -Wl,--whole-archive -lmystaticlib 

क्या आप अनुभव कर रहे है कि डिफ़ॉल्ट रूप से, लिंकर एक स्थिर संग्रह है कि द्विआधारी आप की जरूरत उत्पादन में प्रतीकों के लिए खोज करेंगे है, और अगर यह एक जरूरत है, यह पूरे ओ कि शामिल करेंगे प्रतीक में रहता है। अगर आपकी साझा लाइब्रेरी को किसी भी प्रतीक की आवश्यकता नहीं है, तो उन्हें आपके साझा lib में शामिल नहीं किया जाएगा। आप अपने साझा पुस्तकालय में एक स्थिर पुस्तकालय शामिल कर रहे हैं के रूप में

, कि कोड, इस तरह के -fpic के रूप में हो जाता है कि किसी साझा लाइब्रेरी विशेष विकल्पों के साथ संकलित करने की आवश्यकता है याद रखें, स्थिर पुस्तकालय ही विकल्पों के साथ संकलित किया जाना चाहिए।

8

हाल ही में मैं इसके लिए समाधान खोज रहा था। मैं

--undefined=symbol 

या

-u symbol 

हल समस्या का उपयोग कर पाया।

+0

'- व्हाउल-आर्काइव' उत्तर संग्रह में सभी प्रतीकों को साझा लाइब्रेरी में निर्यात किए गए प्रतीकों में बदल देगा। यदि आपको केवल एक प्रतीक की आवश्यकता है, तो यह उत्तर आपके .so में बहुत कम ब्लोट बनाता है। – MuertoExcobito

4

लाइब्रेरी के प्रारंभ के दौरान कहीं और फ़ंक्शन का पता लेना एक और हैक है। यह सुनिश्चित करेगा कि आप वास्तव में प्रतीक का उपयोग करें।

+3

डाउनवॉटर के लिए: मैंने कहा, "हैक" – user877329

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

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