2012-08-06 14 views
5

से गतिशील लाइब्रेरी लोड करें क्या मैक/जीसीसी पर फाइल सिस्टम से स्मृति से लाइब्रेरी लोड करना संभव है?मेमोरी

विंडोज़ के साथ मैं मेमोरी मॉड्यूल का उपयोग कर रहा हूं लेकिन यह स्पष्ट रूप से क्रॉस-प्लेटफ़ॉर्म संगत नहीं है।

+0

संभावित डुप्लिकेट [स्मृति से dlopen?] (Http://stackoverflow.com/questions/5053664/dlopen-from-memory) –

+0

@ जोनाथन रेनहार्ट - काफी नहीं। यह पूछ रहा है कि स्मृति से लोड करने के लिए 'dlopen' (* विशेष रूप से *)' हैक 'कैसे करें। मैं ऐसा करने के किसी अन्य संभावित तरीके के बारे में सोच रहा हूं। – Qix

उत्तर

6

पहली चीजें पहले, ऐसा करने के लिए मैं सलाह देता हूं कि आप OS X ABI Dynamic Loader Reference पढ़ें।

ऐसा करने के लिए, आपको NSCreateObjectFileImageFromMemory API का उपयोग करना होगा।

स्मृति में एक मैक-ओ फ़ाइल के लिए एक सूचक को देखते हुए, यह फ़ंक्शन NSObjectFileImage संदर्भ बनाता है और देता है। वर्तमान कार्यान्वयन केवल बंडलों के साथ काम करता है, इसलिए आपको -bundle लिंकर विकल्प का उपयोग करके मच-ओ निष्पादन योग्य फ़ाइल बनाना होगा।

मेमोरी ब्लॉक address अंक, vm_allocate (/usr/include/mach/vm_map.h) के साथ आवंटित किया जाना चाहिए।

मॉड्यूल युक्त मेमोरी ब्लॉक के लिए vm_allocate की आवश्यकता का पालन करना सुनिश्चित करें।

एक बार जब आप ऑब्जेक्ट फ़ाइल छवि प्राप्त कर लेते हैं, तो आपको प्रोग्राम में मॉड्यूल को लिंक करने के लिए NSLinkModule फ़ंक्शन का उपयोग करना होगा।

जब आप इस फ़ंक्शन को कॉल करते हैं, तो दिए गए मॉड्यूल द्वारा संदर्भित सभी पुस्तकालय लाइब्रेरी खोज सूची में जोड़े जाते हैं। जब तक आप NSLINKMODULE_OPTION_PRIVATE पास नहीं करते हैं, NSLinkModule मॉड्यूल में सभी वैश्विक प्रतीकों को वैश्विक प्रतीक सूची में जोड़ता है।

लिंक करने के बाद, NSDestroyObjectFileImage फ़ंक्शन को कॉल करके साफ़ करना न भूलें।

जब इस समारोह कहा जाता है, गतिशील लोडर vm_deallocate (/usr/include/mach/vm_map.h) स्मृति पर objectFileImage पैरामीटर द्वारा की ओर इशारा किया कहता है।

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