मेरे पास एक प्रोग्राम 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
मैन पेज पर सूचीबद्ध सभी विकल्पों को देखा है, लेकिन कोई भी आशाजनक नहीं दिखता है।)