2012-08-28 6 views
5

मेरे पास एक प्रोग्राम foo है जो dlopen() के माध्यम से प्लगइन लोड कर सकता है। मैं एक ऐसी प्लगइन foobar लिख रहा हूं जो किसी तृतीय-पक्ष लाइब्रेरी libfoo द्वारा प्रदान की गई कार्यक्षमता के लिए इंटरफेस करता है। अब तकजीएनयू/लिनक्स पर प्लगइन को लिंक करते समय अपरिभाषित प्रतीकों का स्मार्ट तरीके से पता कैसे लगाएं?

gcc -fpic -c -o foobar.o foobar.c 
gcc -fpic -shared -o foobar.so foobar.o -lbar 

तो अच्छा:

लिनक्स पर, मैं foobar इस तरह के निर्माण कर रहा हूँ।

समस्या यह है कि यह अपरिभाषित प्रतीकों का पता नहीं लगाता है, उदाहरण के लिए कोड में बग्स या हेडर फाइलों और लाइब्रेरी के बीच विसंगतियों के कारण। लिंक सफल होता है, और जब आप प्लगइन लोड करते हैं या जब आप प्लगइन में कुछ कहते हैं तो आपको केवल एक त्रुटि मिलती है (dlopen() झंडे के आधार पर)।

साझा लाइब्रेरी में अपरिभाषित प्रतीकों का पता लगाने के लिए, आमतौर पर -Wl,-z,defs या शायद -Wl,--no-allow-shlib-undefined का उपयोग करेगा। लेकिन यह असफल हो जाएगा क्योंकि यह रन टाइम पर foo प्रोग्राम में पाए जाने वाले प्रतीकों की भी रिपोर्ट करेगा। मैं होस्टिंग प्रोग्राम द्वारा प्रदान किए गए को छोड़कर अपरिभाषित प्रतीकों का पता लगाना चाहता हूं।

मैक ओएस एक्स पर, उदाहरण के लिए, यह -bundle_loader विकल्प द्वारा किया जाता है। समकक्ष लिंक कमांड

gcc -bundle -o foobar.so foobar.o -lbar -bundle_loader=foo 

और जिस तरह से मैं चाहता हूं कि अपरिभाषित प्रतीकों का पता लगाए।

कोई भी जीएनयू/लिनक्स या जीएनयू एलडी पर सामान्य रूप से ऐसा कैसे करता है? (मैंने ld मैन पेज पर सूचीबद्ध सभी विकल्पों को देखा है, लेकिन कोई भी आशाजनक नहीं दिखता है।)

उत्तर

0

ऐसा कोई तरीका नहीं है जिसे मैं ऐसा करने के बारे में जानता हूं। हालांकि, अगर 'foo' की संरचना आपके नियंत्रण में है, तो आप संभावित रूप से 'foo' में सभी तर्कों को एक नई साझा लाइब्रेरी में स्थानांतरित कर सकते हैं जो उचित प्रतीकों को निर्यात करता है, और फिर उस लाइब्रेरी के विरुद्ध अपने प्लगइन और मुख्य दोनों लिंक को लिंक करता है।

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