2012-05-12 14 views
6

मुझे पता चला कि जब हम nested functions का उपयोग करते हैं, तो जीसीसी को trampoline code के लिए निष्पादन योग्य स्टैक की आवश्यकता होती है। हालांकि, कोड के बाद, जीसीसी का उपयोग करके संकलित जब निष्पादन योग्य ढेर नहीं दिखाता है।लिनक्स में निष्पादन योग्य ढेर का उदाहरण (i386 आर्किटेक्चर)

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
     int add(int a, int b) 
     { 
       return a + b; 
     } 
     return add(2, 3); 
} 

यह एक निष्पादन योग्य ढेर में परिणाम क्यों नहीं करता है (मैं अगर ढेर निष्पादन योग्य है सत्यापित करने के लिए execstack प्रयुक्त)? और यदि ऐसा नहीं माना जाता है, तो क्या कोई कोड निर्माण का उदाहरण दे सकता है जो निष्पादन योग्य ढेर देता है?

+0

मुझे लगता है कि स्थानीय स्तर पर परिभाषित कार्यों निष्पादन ढेर की जरूरत नहीं है क्योंकि उनके कोड अभी भी नहीं अन्य कार्यों के रूप में एक ही कोड खंड में संग्रहीत है, और पर ढेर। –

उत्तर

4

नेस्टेड समारोह "पेरेंट" के ढेर में सब पर निर्भर नहीं करता है, तो यह सिर्फ एक सादे समारोह है - नेस्टिंग है सिंटेक्टिक (और स्कोपिंग) चीनी।

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

यहाँ एक डमी उदाहरण है:

// file t.c 
int doit(int (*fun)(int), int x) 
{ 
    return fun(x); 
} 

int foo(int a) 
{ 
     int add(int b) 
     { 
       return a + b; 
     } 
     return doit(&add, 2); 
} 

int main(void) 
{ 
    return foo(1); 
} 
$ gcc t.c 
t.c: In function 'foo': 
t.c:8:13: warning: trampoline generated for nested function 'add' 
$ ./a.out 
$ echo $? 
3 
$ execstack a.out 
X a.out 
2

के रूप में अपने लिंक http://gcc.gnu.org/onlinedocs/gccint/Trampolines.html

एक ट्रैम्पोलिन कि रन टाइम पर बनाई गई है जब एक नेस्टेड समारोह का पता लिया जाता है कोड का एक छोटा सा टुकड़ा है में कहा। यह आमतौर पर युक्त फ़ंक्शन के ढेर फ्रेम में, ढेर पर रहता है।

आपके उदाहरण में नेस्टेड का पता नहीं लिया गया है और जीसीसी को निष्पादन का उपयोग करने की आवश्यकता नहीं है।

यहाँ ट्रैम्पोलिन के साथ कोड का एक उदाहरण है: http://www.win.tue.nl/~aeb/linux/hh/protection.html

% cat trampoline.c 
#include <stdio.h> 
int main(int ac, char **av) { 
     int localfn(int a) { 
       return a+ac; 
     } 
     int (*fptr)(int) = localfn; 

     printf("%d\n", fptr(-1)); 
     return 0; 
} 
संबंधित मुद्दे