2009-08-22 18 views
8

में वैश्विक स्तर पर मॉलोक ओवरराइड करें, मैं विज़ुअल सी ++ (2005) में वैश्विक स्तर पर मॉलोक और संबंधित कार्यों को ओवरराइड करने का एक तरीका जानने का प्रयास कर रहा हूं। मेरा सेटअप एक डीएलएल है जो स्थिर रूप से जुड़े रनटाइम लाइब्रेरी के साथ है जिसमें मेरे स्वयं के सी ++ कोड, बाहरी सी ++ और सी कोड दोनों शामिल हैं। मैं जो हासिल करना चाहता हूं वह है कि डीएल के उपयोगकर्ता को स्मृति आवंटन कार्यों के अपने कार्यान्वयन को सेट करना है।विज़ुअल सी ++

समाधान है कि मैं का उपयोग नहीं कर सकते हैं: मेरी कोड स्थान है जहाँ इस होगा कई आवंटन नहीं कब्जा का मतलब है में बाहरी सी पुस्तकालयों के बहुत सारे

  • अधिभावी नए और विश्व स्तर पर हटा सकते हैं, है।
  • मॉलोक को एक अलग प्रतीक पर परिभाषित करना। यह मुझे इस बाहरी परिभाषाओं के निर्माण की सभी सेटिंग्स की परिभाषाओं में परिभाषित करने के लिए मजबूर करेगा और मैं वास्तव में इससे बचना चाहता हूं।

हालात के बारे में मैं

  • परवाह नहीं है बाह्य पुस्तकालयों में से किसी किसी अन्य तरीके से स्मृति का आवंटन कर रहे हैं (HeapAlloc, स्मृति मैप की गई फ़ाइलों या जो कुछ भी वे के साथ आ), मुझे लगता है कि स्वीकार यह malloc overriding द्वारा ठीक से ट्रैक नहीं किया जाएगा।

सबसे उचित समाधान मैं के साथ किसी भी तरह कड़ी प्रक्रिया के साथ हस्तक्षेप कर रहा है और ऊपर आ सकते हैं यकीन है कि मेरे अपने malloc मानक वाले के बजाय जोड़ा जा रहा है, खासकर मैं पुराने malloc उपयोग करने में सक्षम होना चाहते हैं डिफ़ॉल्ट रूप से कार्य करता है।

Google perf-tools में ऐसा लगता है कि वे मूल कार्य को कॉल करने से पहले एक हुक फ़ंक्शन को कॉल करने की अनुमति देने के लिए रनटाइम पर मैन्युअल रूप से फ़ंक्शन का कोड पैच करते हैं। क्या यह वास्तव में ऐसा करने का सबसे अच्छा तरीका है?

+0

क्या आप लिनक्स पर एलडी_PRELOAD के समान काम करने की कोशिश कर रहे हैं? – LB40

+0

मैं एलडी_PRELOAD से परिचित नहीं हूं, लेकिन ऐसा लगता है कि गतिशील लिंकिंग से संबंधित है, मेरे मामले में मॉलोक, मुफ्त और उनके मित्र स्थिर रूप से जुड़े हुए हैं। – Laserallan

+0

क्या आप समझा सकते हैं कि आपको ऐसा क्यों करना है? –

उत्तर

2

आप माइक्रोसॉफ्ट (वाणिज्यिक के लिए भुगतान) से Detours का उपयोग कर सकते हैं या आपके द्वारा उपयोग किए जाने वाले डीएलएस के लिए आयात तालिकाओं को फिर से लिख सकते हैं।

+0

यह निश्चित रूप से काम कर सकता है अगर मैंने गतिशील रूप से जुड़े रनटाइम लाइब्रेरी का उपयोग किया। हालांकि, मुझे चिंता है कि मैं अपनी लाइब्रेरी का उपयोग करके निष्पादन योग्य के लिए कार्यों को ओवरराइड कर दूंगा। – Laserallan

+0

हां, आप करेंगे। यह एक प्रक्रिया-चौड़ी चीज है। –

5

लिनक्स पर निम्नलिखित सत्य है, लेकिन विन के विज़ुअल सी ++ पर भी लागू हो सकता है।

  1. मॉलोक funciton सिस्टम लाइब्रेरी glibc द्वारा प्रदान किया जाता है। निष्पादन योग्य डिफ़ॉल्ट रूप से इसके खिलाफ जुड़ा हुआ है।

  2. जब प्रोग्राम चलाया जाता है, तो गतिशील लोडर नोटिस करता है कि निष्पादन योग्य मॉलोक फ़ंक्शन की आवश्यकता होती है और इसे प्रदान करने वाली पहली लाइब्रेरी की तलाश करती है।

  3. जैसा कि ग्लिब (डिफ़ॉल्ट रूप से) उस सूची में आखिरी है, लाइब्रेरी मिली ग्लिब नहीं हो सकती है।

जब तक आप स्थिर निष्पादन में glibc लिंक कर लिया है, स्पष्ट समाधान पुस्तकालय है कि अपनी खुद की malloc प्रदान करता है के खिलाफ निष्पादन योग्य लिंक, और यकीन है कि यह सिस्टम के एक ओवरराइड करता है बनाने के लिए है।

+0

यह सही उत्तर – pgast

+1

विंडोज पर इस तरह से काम नहीं करता है। आयात केवल नाम से नहीं हैं। आयात प्रति डीएलएल सूचीबद्ध हैं जिन्हें इसे प्रदान करने की आवश्यकता है। पीई प्रारूप आपको दो डीएलएल से एक ही फ़ंक्शन नाम आयात करने की अनुमति देगा। – MSalters

+0

कूल, तो यह लिनक्स में बस थोड़ा सा _superior_ है - आप वास्तव में सीधे लाइब्रेरी को फ़ंक्शन असाइन कर सकते हैं, ताकि उपयोगकर्ता द्वारा परिभाषित मॉलोक एक विशिष्ट लाइब्रेरी से लोड हो जाए। हम यही चाहते हैं, है ना? –

1

दुर्भाग्य से मुझे माइक्रोसॉफ्ट लिंकर के बारे में पर्याप्त जानकारी नहीं है। लेकिन एलडी में '- लपेटें' है जिसका उपयोग आप मॉलोक या फ्री या किसी और चीज़ के लिए कर सकते हैं (मैं यह करता हूं)।

मैलोक के लिए सभी कॉल को आपके द्वारा लागू किए गए __wrap_malloc नामक फ़ंक्शन पर रीडायरेक्ट किया जाएगा, फिर आप वास्तविक malloc को __real_malloc के साथ कॉल कर सकते हैं।बाहरी पुस्तकालयों में उपयोग किए जाने वाले किसी भी मॉलॉक्स को कैप्चर करने का इसका लाभ भी है। मुझे यकीन है कि माइक्रोसॉफ्ट लिंकर के पास एक समान कार्य हो सकता है।

+0

मुझे विजुअल स्टूडियो लिंकर में ऐसा कुछ नहीं मिला और मैंने पाया कि निकटतम मुझे lib.exe (http://msdn.microsoft.com/en-us/library/7ykb2k5f(VS.71) टूल का उपयोग कर रहा है। aspx)। यह एक स्थिर पुस्तकालय में निकालें और .obj फ़ाइलों को जोड़ सकते हैं। तकनीकी रूप से मैं मानक पुस्तकालय .lib फ़ाइल का अपना संस्करण बना सकता हूं जिसमें पैच किए गए मॉलोक/कॉलोक/फ्री/रीयलोक फ़ंक्शंस हैं। अगर मुझे एक ऐसा उपकरण मिला जो किसी .obj फ़ाइल के अंदर फ़ंक्शंस का नाम बदल सकता है, तो पुराने संस्करणों का नाम बदलना और सुनिश्चित करना होगा कि मेरा ओवरराइड फ़ंक्शंस उन्हें कॉल करता है। – Laserallan

1

आप lib.exe lib के साथ उन .obj फ़ाइलों को हटा सकते हैं। मैं अधिक विशिष्ट नहीं हो सकता लेकिन मुझे याद है कि जब मैं स्रोत से क्रोमियम का निर्माण कर रहा था तो मुझे ऐसा करना याद है।

+0

आप अंतर्निहित माइक्रोसॉफ्ट सी ++ रनटाइम लाइब्रेरी में हेरफेर करने का सुझाव नहीं दे रहे हैं? – rustyx

5

मैं इसके लिए एक साफ समाधान खोजने के लिए उत्सुक हूं। हम कई प्लेटफार्मों के लिए संकलित करते हैं, इसलिए उन चीजों के गैर-खिड़कियों के पक्ष में जिन्हें हम उपयोग कर सकते हैं - खुशी से लपेटें। हमें केवल प्रतिस्थापन कार्यों को बनाना है और यह सभी त्रुटियों या हैक्स के बिना काम करता है।

चीजों की खिड़कियों की तरफ, हम मॉलोक कॉल को ओवरराइड करते हैं, लेकिन फिर लिंकर त्रुटियों से निपटने के लिए /FORCE:MULTIPLE का उपयोग करें। यह काम करता है, स्मृति कार्यों को बुलाया जाता है और सब कुछ ट्रैक किया जाता है, लेकिन यह एक हैक की तरह लगता है।

MSDN से:

A file created with this option may not run as expected. The linker will not link incrementally when the /FORCE option is specified.

इतना ही नहीं यह एक हैक की तरह महसूस करता है, यह संपादित मारता है और इस प्रक्रिया में जारी है।

/FORCE:MULTIPLE विकल्प आपकी समस्याओं को ठीक कर सकता है, लेकिन मैं इसे इलाज के रूप में सुझाव नहीं दे रहा हूं, मैं अभी भी इसे ढूंढने की कोशिश कर रहा हूं।

MSDN /FORCE Documentation

: डी

+0

यह उपयोगी लग रहा है। संकल्प का किस क्रम का उपयोग किया जाता है? मानक लाइब्रेरी के साथ संघर्ष होने पर हमेशा मेरा अपना मॉलोक इस्तेमाल होता है? क्या आप अपने कस्टम मॉलोक के माध्यम से कॉल को मूल परिभाषा में रूट करते हैं या आपने मॉलोक के मानक लाइब्रेरी संस्करण को पूरी तरह से फेंक दिया है? – Laserallan

+0

हम वास्तविक आवंटन करने के लिए dlmalloc का उपयोग कर रहे हैं। मैं इस धारणा के तहत हूं कि यह हमेशा ओवरराइड फ़ंक्शंस लेगा, लेकिन अब आपने सवाल उठाया है, मुझे यकीन नहीं है। : डी –

1

.obj फ़ाइलों को उदारीकरण उपकरण का उपयोग क्रम पुस्तकालयों से स्मृति प्रबंधन कार्य शामिल के सभी निकालें, फिर मैन्युअल रूप से IDE में "डिफ़ॉल्ट पुस्तकालयों पर ध्यान न दें" विकल्प का उपयोग और इसके बजाय "अपनी" रनटाइम लाइब्रेरी निर्दिष्ट करें। फिर संकलित करें; आपको अपरिभाषित malloc और free और इसी तरह के बारे में कुछ लिंकर त्रुटियां प्राप्त करनी चाहिए। यह वो जगह है जहां आप आते हैं!

(आप शायद भी सी ++ पुस्तकालयों के लिए इसी तरह कुछ करने के लिए अगर आप उन्हें इस्तेमाल करते हैं, हालांकि मुझे लगता है कि डिफ़ॉल्ट operator new रों कॉल malloc ताकि आप सीधे जाने के लिए अच्छा हो सकता है चाहता हूँ।)

दृश्य स्टूडियो इंस्टॉल रनटाइम स्रोत कोड के साथ आता है (अपने विजुअल स्टूडियो इंस्टॉल फ़ोल्डर में vc/crt/src में देखें), इसलिए मेमोरी प्रबंधन कार्यों का पूरा सेट ढूंढना काफी सरल है। मेरे पास हाथ (पिछले नियोक्ता ...) के लिए सटीक विवरण नहीं हैं, लेकिन जैसा कि मुझे याद है, मुझे लगता है कि यह अपेक्षाकृत अधिक आधा दिन आवंटन कार्यों के बावजूद केवल आधे दिन का समय लगता है।

+0

धन्यवाद, यह पहेली का अंतिम भाग जोड़ने लगता है। – Laserallan

2

मैंने जो समाधान उपयोग किया है वह स्रोत कोड से विजुअल सी ++ सी रनटाइम लाइब्रेरी (सीआरटी) का पुनर्निर्माण करना है।

यह यहाँ इस फ़ोल्डर में पाया जा सकता है:

C: \ Program Files \ Microsoft Visual Studio 9.0 \ कुलपति \ CRT

सुनिश्चित करें कि आप इसे बनाने की दृश्य स्टूडियो कमांड प्रॉम्प्ट शुरू करें। एनएमके चलाना इसे भवन शुरू करने के लिए पर्याप्त है हालांकि आप काम करना चाहते हैं कि कौन सा लक्ष्य बनाना है और इसका मतलब है कि आपको मेकफ़ाइल समझना होगा।

यह CRT निर्माण करने के लिए कैसे समझने का प्रयास लग सकता है, लेकिन एक बार आप इसे, आप malloc, नि: शुल्क और realloc में अपने खुद के कोड जोड़ सकते हैं का निर्माण आदि

दुर्भाग्य से मैं एक अफवाह सुना है कि हम विजुअल स्टूडियो 2010 से शुरू होने वाले स्रोत कोड से सीआरटी बनाने में सक्षम नहीं होंगे।

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