संकलित करना मैंने एक कस्टम लाइब्रेरी लिखी है जो मानक सी प्रोटोटाइप का उपयोग करके मॉलोक/कॉलोक/रीयलोक/फ्री लागू करता है, और मुझे पता चला कि इसे कैसे संकलित करना है। मैं इसके खिलाफ एक मानक आवेदन को जोड़कर पुस्तकालय का परीक्षण करना चाहता हूं? ऐसा करने का एक अच्छा तरीका क्या होगा? एक बार जब मेरे पास एक वर्किंग लाइब्रेरी हो, तो मुझे लगता है कि मैं इसे एलडी_PRELOAD के साथ लोड कर सकता हूं, लेकिन मैं अपने कार्यों को सह-अस्तित्व में कैसे प्राप्त करूं लेकिन सिस्टम लाइब्रेरी वाले पर प्राथमिकता ले सकता हूं? मेमोरी को चलाने के लिए मेरे कार्यों को मॉलोक को कॉल करने की आवश्यकता है, इसलिए मैं पूरी तरह से stdlib को हटा नहीं सकता ... मदद?एक कस्टम मॉलोक
उत्तर
जिन कार्यों को आप प्रतिस्थापित करने का प्रयास कर रहे हैं वे मानक सी फ़ंक्शंस हैं, मैक्रोज़ नहीं, सिस्टम कॉल नहीं। तो आपको बस अपने कार्यों को एक ही नाम देना होगा और उन्हें साझा लाइब्रेरी में संकलित करना होगा।
फिर बाइनरी शुरू होने से पहले अपनी लाइब्रेरी को प्री-लोड करने के लिए LD_PRELOAD
का उपयोग करें। चूंकि सभी पते एक बार हल हो जाते हैं, इसलिए लिंकर आपके कार्यों के पते निकाल देगा और उनके नाम याद रखेगा और बाद में मानक पुस्तकालय में उनकी तलाश नहीं करेगा।
यदि आपका प्रोग्राम मानक रनटाइम के साथ स्थिर रूप से जुड़ा हुआ है तो यह दृष्टिकोण काम नहीं कर सकता है। साथ ही, यह मैक ओएस एक्स पर काम नहीं करेगा क्योंकि इंटरपोलेशन के लिए एक और एपीआई है।
लिनक्स में, उदाहरण के लिए, के लिए अपने कार्यों सह अस्तित्व के लिए करने के लिए (यानी आप malloc
का अपना स्वयं का कार्यान्वयन में प्रणाली malloc
उपयोग करना चाहते हैं), तो आप मानक पुस्तकालय मैन्युअल dlopen
का उपयोग कर खोलने के लिए है, कार्यों को देखने में आपको dlsym
का उपयोग करके वहां आवश्यकता है और बाद में उन्हें पते से कॉल करें।
मैंने सोचा कि मैं और अधिक समस्याओं में भागूंगा लेकिन मानक पुस्तकालय को शामिल करने और मैलोक लोड करने के बाद और dlsym सब कुछ ठीक से संकलित करने के बाद बाहर निकल गया। धन्यवाद! – conartist6
@ conartist6: आपका स्वागत है :) –
यदि आपके पास इस लाइब्रेरी का उपयोग करने वाले स्रोत कोड का नियंत्रण है, तो यहां एक संभावना है। विभिन्न फ़ंक्शन नामों का उपयोग करें: मॉलोक की बजाय, उदाहरण के लिए, इसे नया CoolMalloc कहते हैं। यह विधि कभी-कभी सरल होती है और विशेष लिंकर विकल्पों पर निर्भर नहीं होती है।
फिर अपने कोड में, कोड के वांछित सेट को कॉल करने के लिए कोड को #define
का उपयोग करें। आप # कुछ अलग होने के लिए malloc परिभाषित कर सकते हैं। उदाहरण के लिए:
#define malloc newCoolMalloc
#define free newCoolFree
यदि आप ऐसा करते हैं, तो आपको लगातार इसमें शामिल होने के लिए बहुत सावधान रहना होगा। अन्यथा आप एक स्थान पर stdlib malloc का उपयोग करने का जोखिम चलाते हैं और फिर अपनी खुद की मुक्त दूसरी गन्दा बग्स में मुक्त होते हैं। उस स्थिति को कम करने में मदद करने के लिए एक तरीका है (यदि संभव हो) अपने कोड में आवंटन और मुक्त कार्यों के लिए कस्टम नाम का उपयोग करें। फिर यह सुनिश्चित करना आसान है कि सही व्यक्ति को बुलाया जा रहा है। आप विभिन्न कस्टम नामों को अपने स्वयं के मॉलोक फ़ंक्शंस या यहां तक कि मूल stdlib malloc फ़ंक्शंस में परिभाषित कर सकते हैं। तब
someThing = mallocPlaceHolder(nbytes);
अपने परिभाषित करता है और अधिक इस प्रकार दिखाई देगा:
उदाहरण के लिए, आप mallocPlaceHolder वास्तविक नाम के रूप में कोड में उपयोग कर सकते हैं
#define mallocPlaceHolder myCoolMalloc
तो प्रपत्र mallocPlaceHolder का कोई समारोह (और मुफ्त में) वास्तव में मौजूद है, यह विभिन्न पुस्तकालयों मिश्रण मिश्रण से बचाता है।
दुर्भाग्यवश यह मेरे लिए काम नहीं करता है। मैं इस लाइब्रेरी का उपयोग करके किसी और के आवेदन को चलाकर अपने आवंटकों का परीक्षण करना चाहता हूं।मैं सिद्धांतों में शामिल लोगों के साथ पुन: संकलित कर सकता हूं, लेकिन समय और प्रयास एलडी_PRELOAD के साथ सहेजा जाएगा। – conartist6
malloc()
malloc()
के संदर्भ में अपने malloc()
को न लिखें - इसे sbrk
का उपयोग करके लिखें, जो सीधे ओएस से मेमोरी प्राप्त करता है।
दिलचस्प सुझाव। मैं इस पर गौर करूंगा। – conartist6
कुछ सिस्टमों पर, 'sbrk() 'अब उपलब्ध नहीं है। उदाहरण के लिए, मेरे वर्तमान मैक ओएस एक्स पर, आदमी कहता है, ' वर्चुअल मेमोरी मैनेजमेंट' के आगमन से पहले बीआरके और एसब्रैक फ़ंक्शंस ऐतिहासिक जिज्ञासाएं हैं। और यदि आप फ़ंक्शन का पूरा स्रोत देखते हैं, तो यह भी है मजेदार: 'errno = ENOMEM; वापसी ((शून्य *) - 1); ' – achedeuzot
मुझे पूरा यकीन है कि मेरा उत्तर गतिशील लिंकर के उपयोग में है। – conartist6