2008-09-23 14 views
9

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

MSVCRT.lib(MSVCR80.dll) : error LNK2005: _malloc already defined in test.lib(test.obj) 

यह किसी भी यूनिक्स पर पूरी तरह से काम करता है, और यह सबसे अधिक कार्यों के साथ विंडोज पर काम करता है, लेकिन malloc के साथ नहीं। मैं यह कैसे कर सकता हूँ? और मॉलोक के साथ क्या अलग है जो इसे ओवरराइड करने की अनुमति नहीं देता है?

मैं मैं हर अपने कस्टम malloc साथ malloc, या मैक्रो का उपयोग यह करने के लिए करने के लिए कॉल की जगह सकता है पता है, लेकिन मैं नहीं बल्कि हर तीसरे पक्ष के पुस्तकालय को संशोधित नहीं होगा।

उत्तर

15

वहाँ कितना मुश्किल यह यहाँ है की वास्तव में अच्छी चर्चा है: वास्तव में, एक एमएस कर्मचारी में तकनीक दिया:

http://benjamin.smedbergs.us/blog/2008-01-10/patching-the-windows-crt/

जाहिर है, आप सीआरटी पैच करने के लिए

संपादित की जरूरत है चर्चा। आप एक lib करने के लिए अपने malloc ले जाते हैं, और उसके बाद सीआरटी से पहले लिंक करने की आवश्यकता

"उन्होंने यह भी कहा गया है कि अगर आप सीआरटी से पहले एक lib के रूप में अपने malloc लिंक (यानी 'डिफ़ॉल्ट libs उपेक्षा को चालू करने के लिए सुनिश्चित करें 'और स्पष्ट रूप से सीआरटी शामिल करें), आप जो चाहते हैं उसे प्राप्त करेंगे, और बिना किसी समस्या के इस lib को पुनः वितरित कर सकते हैं। "

+0

एक ही चर्चा में यह उल्लेख किया गया है कि दृष्टिकोण "CRT से पहले lib" मज़बूती (strdup) – Weidenrinde

+0

क्या '_CrtSetAllocHook' के बारे में जैसे कार्यों के साथ काम नहीं करता: https://msdn.microsoft.com/en-us/library/ cy8c7wz5.aspx – dashesy

2

मैं इसे निर्भर करता है, जिसमें आदेश आप फ़ाइलों को जोड़ने के बारे में सोचो। मुझे लगता है कि आपको पहले अपने कस्टम फ़ंक्शन को लिंक करना होगा, फिर आयात लाइब्रेरी।

+0

यह सही है - वह पहली बार, एक lib करने के लिए ले जाने के लिए malloc "डिफ़ॉल्ट libs उपेक्षा" को चालू करने की जरूरत है, और फिर स्पष्ट रूप से सीआरटी से लिंक। –

1

संस्करण 3.0 Firefox से एक कस्टम संभाजक (AFAIR jmalloc) का उपयोग करता है - आप जांच कर सकता है कि वे किस तरह किया था। मैंने पढ़ा कि उन्हें इसके साथ कुछ समस्याएं थीं। आप यह blog post देख सकते हैं।

1

क्या परियोजना makefile में malloc = _custom_malloc परिभाषित करने के बारे। जैसे एक फ़ाइल जोड़ने से:

my_memory.c 
#undef malloc 
#undef calloc 
... 
void *_custom_malloc(int size) { return jmalloc(size); } 
void *_custom_calloc(int size) { return jcalloc(size); } 
... 
+1

यह पुस्तकालयों पर काम नहीं करेगा मेरे पास स्रोत नहीं है। – Jazz

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

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