2011-09-02 22 views
5

मैं चल रहा है, जबकि एक कार्यक्रम के पैच भागों के लिए नग्न कार्यों का उपयोग करें। मैं विंडोज़ में वीसी ++ में आसानी से ऐसा कर सकता हूं। मैं इसे लिनक्स में करने की कोशिश कर रहा हूं और ऐसा लगता है कि जीसीसी नग्न कार्यों का समर्थन नहीं करता है। नग्न कार्यों के साथ संकलन कोड मुझे यह देता है: चेतावनी: 'नग्न' विशेषता निर्देश को अनदेखा किया जाता है। CentOS 5.5 i386 के तहत संकलित। एआरएम, AVR पर इस विशेषता उपयोग:जीसीसी समर्थन नग्न कार्यों का समर्थन क्यों नहीं करता है?

+1

जीसीसी का कौन सा संस्करण? –

+0

यह वीसी की एक विशेष विशेषता प्रतीत होता है: http://msdn.microsoft.com/en-us/library/21d5kd3a(v=vs.80).aspx – JohnTortugo

उत्तर

4

नग्न विशेषता केवल docs के अनुसार कुछ खास प्लेटफॉर्म (एआरएम, AVR, MCORE, RX और एस पी यू) पर जीसीसी द्वारा समर्थित है:

naked , एमसीओआर, आरएक्स और एसपीयू बंदरगाहों को इंगित करता है कि निर्दिष्ट फ़ंक्शन को संकलक द्वारा उत्पन्न प्रस्ताव/एपिलॉग अनुक्रमों की आवश्यकता नहीं है। यह प्रोग्रामर पर पर इन अनुक्रम प्रदान करता है। नग्न कार्यों में शामिल सुरक्षित रूप से एकमात्र बयान एएसएम स्टेटमेंट्स हैं जिनके पास ऑपरेंड नहीं हैं। स्थानीय चर, यदि बयानों, और आगे के घोषणापत्र सहित सभी अन्य बयान से बचा जाना चाहिए। असेंबल फ़ंक्शंस का उपयोग असेंबली फ़ंक्शन के शरीर को कार्यान्वित करने के लिए किया जाना चाहिए, जबकि कंपाइलर को असेंबलर के लिए फ़ंक्शन घोषणा का निर्माण करने की इजाजत दी गई है।

मुझे यकीन नहीं है कि क्यों।

+0

आपको केवल एएसएम कथन का उपयोग करने की आवश्यकता क्यों है जो ' ऑपरेटिंग नहीं है? लगभग सभी आदेशों का संचालन नहीं होता है (यहां तक ​​कि 'jmp' जैसी चीजें एक ऑपरेंड लेती हैं)? –

+4

@ सेठ: असेंबलर कोड में उपयोग किए गए निर्देशों में ऑपरेंड हो सकते हैं, लेकिन "एएसएम कथन" का मतलब असेंबलर निर्देश नहीं है, यह संपूर्ण 'एएसएम ("कुछ इंसन्स" है: आउटपुटब्लैह: इनपुटब्लैह: क्लोबबरब्लह); '। "Blahs" एएसएम कथन के संचालन हैं, और यदि आप संकलक द्वारा उत्पन्न प्रस्तावना नहीं है तो आप इसका उपयोग नहीं कर सकते हैं। आप असेंबलर लिख सकते हैं, लेकिन आप इसे सी चर के लिए हुक नहीं कर सकते हैं। –

+0

@Steve ओह ठीक है, मुझे यह मिल गया, धन्यवाद। –

1

जीसीसी केवल एआरएम और अन्य एम्बेडेड प्लेटफार्मों पर नग्न कार्यों का समर्थन करता है। http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

इसके अलावा, आप जो भी कर रहे हैं वह स्वाभाविक रूप से असुरक्षित है, क्योंकि आप यह गारंटी नहीं दे सकते कि आप जिस कोड को पैच कर रहे हैं वह प्रोग्राम चल रहा है या नहीं।

2

यह एक बदसूरत समाधान है। अपने लक्षित वास्तुकला के लिए एक .asm फ़ाइल के खिलाफ लिंक करें।

0

86 आप के बजाय वैश्विक क्षेत्र में एएसएम का उपयोग करके वैकल्पिक हल कर सकते हैं पर:

int write(int fd, const void *buf, int count);            

asm                    
(                    
".global write        \n\t"          
"write:         \n\t" 
"  pusha        \n\t"          
"  movl $4, %eax     \n\t"          
"  movl 36(%esp), %ebx    \n\t"          
"  movl 40(%esp), %ecx    \n\t"          
"  movl 44(%esp), %edx    \n\t"          
"  int $0x80      \n\t"          
"  popa        \n\t"          
"  ret        \n\t"          
);                    

void _start()                  
{                     
#define w(x) write(1, x, sizeof(x));            
    w("hello\n");                 
    w("bye\n");                 
}                     

इसके अलावा nakedx86 function attributes सूची में शामिल किया गया है, इसलिए मैं इसे नए जीसीसी के लिए काम करता है लगता है।

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