2012-06-18 15 views
5

प्रारंभ पता फ़ंक्शन नाम से प्राप्त किया जा सकता है, फ़ंक्शन का अंतिम पता कैसे ढूंढें? मैं साक्षात्कार में यह प्रश्न पूछा गया है:सी प्रोग में किसी फ़ंक्शन का अंतिम पता कैसे खोजें?

पर विचार करें समारोह च() जो मैं लिखा पाठ अनुभाग पार कर गया है और आसन्न धारा (डेटा अनुभाग) लेखन से अधिक शुरू कर दिया। मैं इस स्थिति को कैसे संभाल सकता हूं? इसके अलावा उन्होंने कहा कि मुझे इसे सी कोड के माध्यम से संभालना चाहिए। मुझे प्रतीक मानचित्र फ़ाइल नहीं दिखनी चाहिए और पता प्राप्त करना चाहिए।

+0

कोई मानक तरीका नहीं है। आप फ़ाइल में अगले फ़ंक्शन का पता लेने का प्रयास कर सकते हैं, फिर घटाना - लेकिन इसकी कोई गारंटी नहीं है कि यह काम करेगा। उदाहरण के लिए, लिंकर कार्यों को वर्णानुक्रम में क्रमबद्ध कर सकता है, ताकि अन्य कार्यों के लिए स्थान शामिल हो, या यह नकारात्मक आकार दे सकता है। –

+1

आपको आर्किटेक्चर और एबीआई निर्दिष्ट करना होगा या आपको उपयोगी उत्तर नहीं मिलेगा। –

+0

"मुझे साक्षात्कार में इस सवाल से पूछा गया है" मुझे संदेह है कि आपने इस सवाल को गलत समझा है, और वे पूछ रहे थे कि आपने डेटा को गलती से निष्पादित करना शुरू किया है या नहीं। जवाब "डेटा निष्पादन रोकथाम" होगा अन्यथा स्मृति को ध्वजांकित करने के लिए हार्डवेयर सुविधा के रूप में जाना जाता है जिसे निष्पादित नहीं किया जा सकता है। – Ben

उत्तर

1

आप भाषा का उपयोग नहीं कर सकते हैं, सी कार्यों के लिए "आकार" की अवधारणा का खुलासा नहीं करता है।

आप जो करने में सक्षम हो सकते हैं वह आपके प्रोग्राम की बाइनरी फ़ाइल का निरीक्षण करता है, और प्रतीक तालिकाओं को पार्स करता है और इसी तरह।

+0

आप प्रतीक तालिका के पार्स में मदद करने के लिए सिफारिश करने के लिए किसी भी पुस्तकालय है? अजीब मैं एक लेकिन केवल एक कमांड लाइन टूल "योगिनी पुस्तकालय पढ़ें" खोजने के लिए सक्षम नहीं हूँ –

2

सी मानक गारंटी नहीं देता है कि एक समारोह के अंत पते के रूप में ऐसी चीज है।

प्रैक्टिस में, फ़ंक्शन आवश्यक रूप से स्मृति का एक निरंतर टुकड़ा नहीं है, लेकिन कोड ऑप्टिमाइज़र द्वारा कई टुकड़ों में ओवरलैप या खंडित किया जा सकता है।

इसी कारण से रनटाइम पर इसे खोजने का कोई तरीका नहीं है।

इसके अलावा, इस बात की कोई गारंटी नहीं है कि आपको GetProcAddress से "प्रारंभ पता" मिलता है या फ़ंक्शन का पता (फ़ंक्शन पॉइंटर के लिए) लेते हुए कोड वास्तव में कहां है, इस संबंध में कोई संबंध नहीं है।

सभी फ़ंक्शन पॉइंटर गारंटी यह है कि यदि आप पते के माध्यम से कॉल करते हैं तो फ़ंक्शन निष्पादित किया जाएगा। यह गारंटी नहीं देता है कि कोड वास्तव में वहां रहता है। उदाहरण के लिए, यह सिर्फ एक थंक का पता हो सकता है।

0

आपका कंपाइलर शायद एक असेंबली लिस्टिंग फ़ाइल उत्पन्न कर सकता है और आपका लिंकर शायद एक नक्शा फ़ाइल बना सकता है। ये आपको यह देखने देगा कि एक विशेष कार्य मैन्युअल रूप से कब तक होता है। सुनिश्चित नहीं है कि आपको सी प्रोग्राम के भीतर से आकार निर्धारित करने की आवश्यकता है या नहीं।

5

जीसीसी के साथ, आप && ऑपरेटर (हाँ - &&, & नहीं) के साथ लेबल का पता ले सकते हैं।
यह इस प्रकार के रूप में इस्तेमाल किया जा सकता है:

void f(void) { 
    printf("Start %p End %p\n", f, &&f_end); 
    f_end: return; 
} 

इस लेबल के बाद कुछ उपसंहार कोड है, क्योंकि आप वास्तव में अंत, नहीं देंगे, लेकिन मुझे लगता है कि यह एक साक्षात्कार जवाब के लिए काफी अच्छा है।

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