2012-01-09 16 views
7

मेरे पास एक गतिशील लाइब्रेरी है जिसे मैं dlopen() का उपयोग करके लोड करता हूं और फिर dlclose() का उपयोग करके अनलोड करता हूं;अनलोड गतिशील लाइब्रेरी को दो dlclose() कॉल की आवश्यकता है?

यदि मैं कोई उद्देश्य सी कोड dlopen() शामिल नहीं करता हूं तो dlclose() कॉल की अपेक्षा की जाती है। लेकिन जब मैं लक्षित करने के लिए कोई उद्देश्य सी कोड शामिल करता हूं, तो मुझे समस्या है कि मुझे दो dlclose() लोड करने के लिए लोड की गई लाइब्रेरी को कॉल करने की आवश्यकता है।

क्या यह कुछ अपेक्षित व्यवहार है? मेरे द्वारा यह कैसे किया जा सकता है?

+0

क्या आप सुनिश्चित हैं कि आपकी लाइब्रेरी छिपी हुई तरीके से दो बार 'dlopen'-ed नहीं है? या शायद एक बग-e.g. मेमोरी लीक- 'dlopen'-ed हैंडल के पास स्मृति को ओवरराइट कर रहा है? –

+0

dlopen लाइब्रेरी हैंडल पर संदर्भ संख्या रखता है। यदि डलोपेन दो बार किया गया था, तो पुस्तकालय को उतारने के लिए इसे दो dlclose() की आवश्यकता होगी। यदि आप obj-c कोड शामिल करते हैं तो क्या गतिशील लाइब्रेरी आवश्यक है? जब आप अपना प्रोग्राम – Finslicer

+0

चलाते हैं तो पहले डलोपेन किया जा सकता है हां, मुझे यकीन है कि यह दो बार नहीं खोला गया है। आप मुख्य रूप से dlopen के साथ एक सरल प्रोग्राम का प्रयास कर सकते हैं जिसके बाद गतिशील पुस्तकालय के साथ dlclose है जिसका उद्देश्य सी कोड है। – MacGeek

उत्तर

26

मुझे एहसास है कि आप dlopen का उपयोग कर रहे हैं, CFBundle या NSBundle नहीं।

कोको अनुप्रयोगों में, आप CFBundle दिनचर्या उपयोग नहीं करना चाहिए लोड और निष्पादन योग्य कोड अनलोड करने के लिए, क्योंकि CFBundle देशी रूप ऑब्जेक्टिव-सी क्रम का समर्थन नहीं करता: फिर भी, Code Loading Programming Topics मैनुअल इस कहते हैं। NSBundle रनटाइम सिस्टम में ऑब्जेक्टिव-सी प्रतीकों को सही ढंग से लोड करता है, लेकिन रनटाइम सीमा के कारण लोड होने के बाद कोको बंडलों को उतारने का कोई तरीका नहीं है।

और इस:

ऑब्जेक्टिव-सी क्रम प्रणाली में एक सीमा की वजह से

, NSBundle निष्पादन योग्य कोड उतारना नहीं कर सकते।

यह मैं संदेह है कि जब आप अपने पुस्तकालय लोड करते हैं, यह अपने आप में ऑब्जेक्टिव-सी क्रम के साथ पंजीकृत है, और क्रम फिर से dlopen पुस्तकालय पर कॉल (या किसी भी तरह बढ़ जाती है लाइब्रेरी की संदर्भ गिनती)।

मैं ऑब्जेक्टिव-सी क्रम स्रोत कोड खोज की है और this पाया:

// dylibs are not allowed to unload 
// ...except those with image_info and nothing else (5359412) 
if (result->mhdr->filetype == MH_DYLIB && _hasObjcContents(result)) { 
    dlopen(result->os.dl_info.dli_fname, RTLD_NOLOAD); 
} 

तो हाँ, ऑब्जेक्टिव-सी क्रम अपने पुस्तकालय पर dlopen बुला रहा है विशेष रूप से यह उतार होने से रोकने के। यदि आप धोखा देते हैं और dlclose दो बार कॉल करते हैं, तो आपको बुरी चीजें होने की उम्मीद करनी चाहिए।

+0

+1 उत्कृष्ट उत्तर! – Till

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