द्वारा एक और समारोह बाइट प्रति अधिलेखित की मैं एक समारोह है लगता है:सी: बाइट
int f1(int x){
// some more or less complicated operations on x
return x;
}
और है कि मैं एक और कार्य हो
int f2(int x){
// we simply return x
return x;
}
मैं निम्नलिखित की तरह कुछ करने के लिए सक्षम होने के लिए चाहते हैं :
char* _f1 = (char*)f1;
char* _f2 = (char*)f2;
int i;
for (i=0; i<FUN_LENGTH; ++i){
f1[i] = f2[i];
}
आईई मैं f1
और f2
को कच्चे बाइट एरे के रूप में और "f1
बाइट बाइट द्वारा ओवरराइट" की व्याख्या करना चाहता हूं और इस प्रकार इसे f2
द्वारा प्रतिस्थापित करें।
मुझे पता है कि आमतौर पर कॉल करने योग्य कोड लिखने-संरक्षित है, हालांकि, मेरी विशेष स्थिति में, आप केवल स्मृति स्थान को ओवरराइट कर सकते हैं जहां f1
स्थित है। यही है, मैं बाइट्स को f1
पर कॉपी कर सकता हूं, लेकिन बाद में, अगर मैं f1
पर कॉल करता हूं, तो पूरी चीज दुर्घटनाग्रस्त हो जाती है।
तो, सिद्धांत में मेरा दृष्टिकोण संभव है? या क्या कुछ मशीन/कार्यान्वयन/जो कुछ भी निर्भर मुद्दों पर विचार करना है?
मेरा मानना है कि "कॉल करने योग्य कोड लिखने-संरक्षित है" यह जवाब क्यों है कि यह असफल रहा है। मुझे संदेह है कि मैं यह कहने वाला पहला व्यक्ति हूं, लेकिन स्वयं संशोधित कोड आमतौर पर एक भयानक विचार या बग का लक्षण होता है। – DwB
@DwB जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, मुझे पता चला है कि मैं * उस अनुभाग में लिख सकता हूं जहां कार्यों को संग्रहीत किया जाता है। बस * कॉलिंग * ओवरराइट संस्करण का परिणाम क्रैश में होता है। – phimuemue
भी, इस बात को ध्यान में रखें कि f1 शायद f2 से अधिक लंबा है ... यानी अधिक बाइट्स –