2012-01-09 10 views
9

मेरे पास dlopen (झंडे RTLD_NOW | RTLD_GLOBAL के साथ) साझा की गई एक साझा लाइब्रेरी है। यदि यह लाइब्रेरी मुख्य प्रोग्राम से फ़ंक्शंस का उपयोग कर रही है, तो यह अनलोड नहीं होती है। तो मैं इस साझा lib के लिए एक ही कोड के साथ समाप्त होता हूं, भले ही मैंने अनलोड किया हो (dlclose का उपयोग करके), बदल दिया, संकलित, (पुनः) इसे लोड करें।सी ++: डीएलक्लोज़ साझा लाइब्रेरी को अनलोड नहीं करता है

मेरा लक्ष्य वास्तव में एक ही लाइब्रेरी को फिर से लोड करने के बाद पुनः लोड करना है, ताकि मुझे अपने कोड का परीक्षण करने के लिए पूरे प्रोग्राम को फिर से लॉन्च न करना पड़े।

मैं लिनक्स उबंटू 10.04 पर जी ++ 4.2.3 का उपयोग कर रहा हूं।

(संपादित करें)

हल:

"लोड पुस्तकालय RTLD_GLOBAL की वजह से एक प्रतीक का उपयोग करता है"। दरअसल, मेरे पास एक और प्रतीक था। एम्बेडेड जब इसे जोड़ने के लिए शायद वापस बुलाया गया था और मेरी लाइब्रेरी को बंद करने से रोक दिया गया था ... मुझे लगता है कि यह सत्यापित करना संभव है कि एक lib को dlopen (..., RTLD_NOLOAD) का उपयोग करके अनलोड किया गया है पुस्तकालय सही ढंग से उतार दिया गया है।

+0

क्या आप अपने डीएलएल को हैंडल जारी कर रहे हैं? – Felipe

+0

आपको शायद प्लेटफ़ॉर्म (लिनक्स?) और आप किस संस्करण का उपयोग कर रहे हैं, इसके बारे में कुछ और विशिष्ट होना चाहिए। इस तरह के मुद्दे के लिए यह महत्वपूर्ण बात है। –

+0

@Komyg: मैं dlclose (संभाल) का उपयोग कर रहा है, इसलिए मैं यह सोचते हैं कि ऐसा करने से संभाल जारी किया गया है ... – Ben

उत्तर

4

फ़ंक्शन dlclose() गतिशील लाइब्रेरी हैंडल पर संदर्भ गणना को कम करता है। यदि संदर्भ संख्या शून्य पर गिर जाती है और कोई अन्य लोडेड लाइब्रेरी इसमें प्रतीकों का उपयोग नहीं करती है, तो गतिशील लाइब्रेरी अनलोड हो जाती है।

RTLD_NODELETE (dlopen पर) dlclose लाइब्रेरी को उतारने के लिए नहीं बनाता है।

चूंकि आपने RTLD_NODELETE का उपयोग नहीं किया है, इसलिए सबसे संभावित यह है कि लोड की गई लाइब्रेरी RTLD_GLOBAL के कारण प्रतीक का उपयोग करती है।

+0

"लोड लाइब्रेरी RTLD_GLOBAL के कारण प्रतीक का उपयोग करती है"। वास्तव में, मैं एक .एक एम्बेडेड के प्रतीक जब लिंकिंग कि शायद वापस बुलाया गया और पुस्तकालय को रोकने को बंद करने के लिए किया था ... मुझे लगता है कि अगर एक lib उतार दिया उस पर (RTLD_NOLOAD) dlopen का उपयोग कर लाइब्रेरी देखना सही ढंग से unloded है इस बात की पुष्टि कर सकते हैं – Ben

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