2012-06-04 10 views
12

के साथ गतिशील लिंकिंग मैं मॉड्यूल में फ़ंक्शन निष्पादित करना चाहता हूं, इस मॉड्यूल में अन्य मॉड्यूल में निर्भरताएं हल हो जाएंगी। मॉड्यूल बदल सकते हैं (गतिशील संकलन पर्यावरण) इसलिए मैं एक एकल मोनोलिथिक मॉड्यूल में सभी निर्भरताओं को लिंक नहीं करना चाहूंगा, यानी, अगर इसेएलएलवीएम

से बचने की उम्मीद है तो मुझे Linker::linkModules का उपयोग करने की उम्मीद है लेकिन यह हमेशा स्रोत पर विनाशकारी है मॉड्यूल। यह एक मॉड्यूल के लिए ठीक है, एक के आधार पर, क्योंकि यदि कोई बदल गया है, तो कोई बड़ा सौदा नहीं है, लेकिन क्या यह एन-1 मॉड्यूल को पुनर्निर्माण और रिलिकिंक करने के लिए अधिक नहीं है जो बदले गए किसी एक के कारण नहीं बदला?

मुझे आश्चर्य है कि लिंक मॉड्यूल का एक विनाशकारी संस्करण है जो जेआईटी निष्पादन के लिए काम कर सकता है।

उत्तर

3

इस प्रयास करें:

Linker::LinkModules(destinationModule, sourceModule, Linker::PreserveSource, &error); 

आप Linker::DestroySource के बजाय Linker::PreserveSource पारित, तो आप कॉल के बाद sourceModule उपयोग करने के लिए जारी रख सकते हैं।

0

मुझे नहीं लगता कि यह संभव है कि आप जिस समस्या का वर्णन कर रहे हैं, वह संभव है।

अपने आदर्श समाधान में, यदि मॉड्यूल A और B जुड़े हुए थे, को बदलने B तुरंत A में नमूदार हो सकता है?

यदि ऐसा है तो मुझे यह संभव नहीं माना जाता है। Linker::linkModules लिए परिणाम गुजर (B लिंक करने के बाद A की सामग्री को देखने का प्रयास करें। B के प्रतीक A में कॉपी किया गया है)

आप बस B में जानकारी perserve करना चाहते हैं, तो आप llvm::CloneModule साथ B पहले कॉपी कर सकते हैं, ।

+0

सामान्य साझा पुस्तकालयों में, यदि 'बी'changes, 'ए' को अभी भी नए बी को फिर से जोड़ना होगा। मेरा मुद्दा यह है: यदि ए 'बी 0',' बी 1' 'के खिलाफ जुड़ा हुआ है ... बीएन 'और उनमें से एक बदलता है, मुझे केवल उस संदर्भ को फिर से जोड़ना होगा, क्योंकि बाकी नहीं बदला था। वर्तमान लिंक मॉड्यूल एक स्थिर लिंकर (लक्ष्य मॉड्यूल में सबकुछ कॉपी कर रहा है) – lurscher

+1

लिनक्स कर्नेल, इसके मॉड्यूल के साथ, इस तरह कुछ (मॉड्यूल को अनलोड करें, एक नया संस्करण पुनः लोड करें) की अनुमति देता है। लेकिन वहां प्रक्रिया कर्नेल के नियंत्रण में है, और यह सुनिश्चित करने के लिए कि कोड का उपयोग नहीं किया जा रहा है, वहां इंटरलॉक हैं। – vonbrand

1

हमने अपने फैब्रिक इंजन उत्पाद (http://fabricengine.com/) के अंदर गतिशील संकलन वातावरण में कुछ ऐसा किया है। एलएलवीएम वर्तमान में इस तरह के जटिल "जेआईटी" पर्यावरण के अनुकूल नहीं है, लेकिन हम इसे अतिरिक्त स्तर के संकेत (यानी एक डबल पॉइंटर) से जोड़कर काम करने में कामयाब रहे और फिर llvm :: मेमोरीमेनगर को अधिभारित करने के लिए llvm को अधिभारित किया: : MemoryManager :: getPointerToNamedFunction मॉड्यूल के बीच विश्व स्तर पर प्रतीकों को हल करने के लिए। एक डबल पॉइंटर का उपयोग करके, आप किसी भी मॉड्यूल को बदले बिना एक मॉड्यूल बदल सकते हैं। आपको थोड़ा सावधान रहना होगा लेकिन यह बहुत बुरा नहीं है।