2012-02-02 18 views
6

हम उस कार्य के अपने कार्यान्वयन के साथ सी मानक लाइब्रेरी फ़ंक्शन को कैसे प्रतिस्थापित कर सकते हैं?सी मानक लाइब्रेरी फ़ंक्शन को कैसे बदलें?

उदाहरण के लिए, strcpy() के अपने कार्यान्वयन के साथ मैं strcpy() को कैसे बदल सकता हूं और सभी कॉल इसके बजाय नए कार्यान्वयन से लिंक कर सकते हैं?

+0

क्यों आप ऐसा करना चाहते हैं? * संभवतः * बिंदु क्या हो सकता है? –

+0

क्या यह वास्तव में परेशानी के लायक है? आपको string.h शीर्षलेख फ़ाइल को संपादित करना होगा, जिसका स्थान उस सिस्टम और पर्यावरण पर निर्भर करता है जिसका आप उपयोग कर रहे हैं। लेकिन मुझे लगता है कि आप एक अलग समारोह लिखने से बेहतर होगा। – Shredderroy

+0

@ कोडीग्रे, मुझे लगता है, फातालरर के [उत्तर] (http://stackoverflow.com/questions/9107259/how-to-replace-c-standard-library-functioin#9107319) को देखकर, कि आप प्रत्येक कॉल को प्रतिस्थापित कर सकते हैं अपने आप को निष्पादन योग्य जो प्रिंटिंग डीबगिंग करता है? या ऐसा कुछ, मुझे लगता है। हालांकि शायद अच्छा अभ्यास नहीं है। आपको एक अलग नाम के साथ एक नया फ़ंक्शन लिखना चाहिए और सभी कॉल बदलना चाहिए। – Anthony

उत्तर

12

कम से कम जीसीसी और ग्लिब के साथ, मानक सी कार्यों के लिए प्रतीक कमजोर हैं और इस प्रकार आप उन्हें ओवरराइड कर सकते हैं। उदाहरण के लिए,

strcpy.c:

#include <string.h> 
#include <stdio.h> 

char * strcpy(char *dst, const char *src) 
{ 
    char *d = dst; 
    while (*src) { 
    *d = *src; 
    d++; 
    src++; 
    } 
    printf("Called my strcpy()\n"); 

    return (dst); 
} 

int main(void) 
{ 
    char foo[10]; 
    strcpy(foo, "hello"); 

    puts(foo); 

    return 0; 
} 

और यह निर्माण इस तरह:

gcc -fno-builtin -o strcpy strcpy.c 

और उसके बाद:

$ ./strcpy 
Called my strcpy() 
hello 

नोट -fno-builtin यहाँ के महत्व। यदि आप इसका उपयोग नहीं करते हैं, तो जीसीसी strcpy() को बिल्टिन फ़ंक्शन पर कॉल करेगा, जिसमें से जीसीसी की संख्या है।

मुझे यकीन नहीं है कि यह अन्य कंपाइलर्स/प्लेटफॉर्म के साथ काम करता है या नहीं।

+0

मजेदार तथ्य, मेरे 'strcpy() 'उपरोक्त में एक गंभीर गंभीर दोष है। चूंकि यह वास्तव में यहां केंद्रित नहीं है, इसलिए मैं इसे पाठक के लिए एक अभ्यास के रूप में छोड़ दूंगा;)। – FatalError

+3

हालांकि, इस तरह की बात है। कोशिश की गई और सही लाइब्रेरी फ़ंक्शंस को अपने आप में से एक के साथ बदलना लगभग 100% गंभीर त्रुटियों की गारंटी है। –

+0

दोष के लिए: 'strcpy()' के इस संस्करण में, यदि 'src' और' dst' ओवरलैपिंग हो रहे हैं तो लूप स्थिति कभी भी गलत नहीं होगी। – Philip

5

यदि आप लिनक्स पर हैं तो LD_PRELOAD के साथ खेलने का प्रयास कर सकते हैं।

+0

यह सही तरीका प्रतीत होता है। [यहां] (https://github.com/nibrahim/Random-hacks/tree/master/malloc-trace) एक उदाहरण है लेकिन असली सवाल यह है कि क्यों? –

+0

इसे लाइब्रेरी में इंटरपोज़िंग कहा जाता है। आपको एक सी मॉड्यूल बनाना होगा जिसे एक .so फ़ाइल में पीआईसी (स्थिति स्वतंत्र कोड) के रूप में संकलित किया गया है। फिर आप LD_PRELOAD =/path/to/mystrcpy.so सेट करते हैं, आप अपने कोड में dl_open() को कॉल करके भी वही काम कर सकते हैं। Mystrcpy.c को एक ऑब्जेक्ट मॉड्यूल में संकलित करना और बस अपने कोड में हर जगह कॉल करना और mystrcpy ऑब्जेक्ट मॉड्यूल से लिंक करना आसान है। आपको हर जगह mystrcpy के लिए बाहरी घोषणा का भी उपयोग करना होगा। देखें: http://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick –

4

मुझे यकीन नहीं है कि लिंकर को आप जो चाहते हैं उसे करने में कितना मुश्किल होगा, लेकिन यहां एक समाधान है जिसमें किसी भी लिंकर सेटिंग्स को बदलने और प्रीप्रोसेसर मैक्रोज़ का उपयोग करने की आवश्यकता नहीं है ताकि कोई भी कोड जो कॉल करने का प्रयास करता हो

mystuff.h:

#define strcpy my_strcpy 
char * my_strcpy(char * dst, const char * src); 

my_strcpy.c:

strcpy वास्तव में एक समारोह में कहा जाता my_strcpy कॉल

my_code.c:

#include <mystuff.h> 

int main() 
{ 
    /* Any call to strcpy will look like a normal call to strcpy 
     but will actually call my_strcpy. */ 
} 
संबंधित मुद्दे