रोम से सीधे चलाने के लिए एम्बेडेड सिस्टम फर्मवेयर का निर्माण करते समय, मैं कोड कोडर की कोड की विशेष प्रकृति पर जोर देने के लिए प्रवेश बिंदु main()
नामांकन से बचने से बचूंगा। इन मामलों में, मैं सी रनटाइम स्टार्टअप मॉड्यूल का एक अनुकूलित संस्करण की आपूर्ति कर रहा हूं, इसलिए main()
पर BootLoader()
जैसे किसी अन्य नाम के साथ अपनी कॉल को प्रतिस्थापित करना आसान है।
मैं (या मेरे विक्रेता) लगभग हमेशा इन प्रणालियों में सी क्रम स्टार्टअप अनुकूलित करने के लिए, क्योंकि यह असामान्य नहीं है यह सही तरीके से संचालन शुरू करने के लिए राम प्रवर्तन कोड की आवश्यकता के लिए के लिए है। उदाहरण के लिए, सामान्य डीआरएएम चिप्स को उनके नियंत्रण हार्डवेयर की एक आश्चर्यजनक मात्रा की कॉन्फ़िगरेशन की आवश्यकता होती है, और अक्सर उपयोगी होने से पहले पर्याप्त (हजारों बस घड़ी चक्र) देरी की आवश्यकता होती है।जब तक यह पूरा नहीं हो जाता है, तब तक कॉल स्टैक डालने की जगह भी नहीं हो सकती है, इसलिए स्टार्टअप कोड किसी भी फ़ंक्शन को कॉल करने में सक्षम नहीं हो सकता है। यहां तक कि यदि रैम डिवाइस पर बिजली चालू होती है, तो लगभग हमेशा चिप चयन हार्डवेयर या एफपीजीए या दो की मात्रा होती है, जिसके लिए सी रनटाइम को प्रारंभिक प्रारंभ करने के लिए सुरक्षित होने से पहले प्रारंभिक आवश्यकता होती है।
जब सी लोड और शुरू में लिखा गया एक प्रोग्राम, कुछ घटक पर्यावरण बनाने के लिए ज़िम्मेदार है जिसमें main()
मौजूद है। यूनिक्स, लिनक्स, विंडोज, और अन्य इंटरैक्टिव वातावरण में, उस प्रयास में से अधिकांश ओएस घटक का एक प्राकृतिक परिणाम है जो प्रोग्राम को लोड करता है। हालांकि, यहां तक कि इन वातावरणों में main()
से पहले शुरू करने के लिए प्रारंभिक कार्य की कुछ मात्रा भी कहा जा सकता है। यदि कोड वास्तव में सी ++ है, तो वहां पर्याप्त मात्रा में काम हो सकता है जिसमें सभी वैश्विक ऑब्जेक्ट उदाहरणों के लिए कन्स्ट्रक्टर को कॉल करना शामिल है।
इन सभी का विवरण लिंकर और इसकी कॉन्फ़िगरेशन और नियंत्रण फ़ाइलों द्वारा प्रबंधित किया जाता है। लिंकर एलडी (1) में एक बहुत ही विस्तृत नियंत्रण फ़ाइल है जो यह बताती है कि आउटपुट में कौन से सेगमेंट शामिल हैं, किस पते पर और किस क्रम में। लिंकर कंट्रोल फ़ाइल ढूंढना जो आप अपने टूलचैन के लिए पूरी तरह से उपयोग कर रहे हैं और इसे पढ़ना निर्देशक हो सकता है, क्योंकि लिंकर के लिए संदर्भ मैनुअल और एबीआई मानक आपके एक्जिक्यूटिव को चलाने के क्रम में पालन करना चाहिए।
संपादित करें: अधिक सामान्य संदर्भ में पूछे गए प्रश्न का अधिक सीधे जवाब देने के लिए: "क्या आप मुख्य के बजाय foo को कॉल कर सकते हैं?" जवाब "शायद, लेकिन केवल मुश्किल होने के द्वारा" है।
विंडोज़ पर, एक निष्पादन योग्य और डीएलएल फ़ाइल के लगभग समान प्रारूप हैं। एक प्रोग्राम लिखना संभव है जो रनटाइम पर नामित मनमानी डीएलएल लोड करता है, और इसके भीतर एक मनमाने ढंग से कार्य करता है, और इसे कॉल करता है। ऐसा एक कार्यक्रम वास्तव में एक मानक विंडोज वितरण के हिस्से के रूप में जहाज: rundll32.exe
।
चूंकि .EXE फ़ाइल को उसी एपीआई द्वारा लोड और निरीक्षण किया जा सकता है जो डीएलएल फाइलों को संभालता है, सिद्धांत रूप में यदि .EXE में एक निर्यात अनुभाग है जो foo
फ़ंक्शन का नाम देता है, तो लोड करने के लिए एक समान उपयोगिता लिखी जा सकती है और इसे बुलाओ आपको main
के साथ विशेष कुछ भी करने की आवश्यकता नहीं है, क्योंकि यह प्राकृतिक प्रवेश बिंदु होगा। बेशक, आपके रनटाइम में शुरू की गई सी रनटाइम एक ही सी रनटाइम नहीं हो सकती है जो आपके निष्पादन योग्य से जुड़ी थी। (संकेत के लिए "डीएलएल नरक" के लिए Google।) उस स्थिति में, आपकी उपयोगिता को बेहतर होने की आवश्यकता हो सकती है। उदाहरण के लिए, यह एक डीबगर के रूप में कार्य कर सकता है, main
पर एक ब्रेक पॉइंट के साथ EXE लोड करें, उस ब्रेक पॉइंट पर चलाएं, फिर पीसी को foo
पर इंगित करें और वहां से जारी रखें।
लिनक्स पर कुछ प्रकार की समान चाल चलाना संभव हो सकता है। इसलिए फाइलें भी कुछ निष्पादन योग्य अधिकारों के समान हैं। निश्चित रूप से, एक डीबगर की तरह अभिनय के दृष्टिकोण को काम करने के लिए बनाया जा सकता है।
आपको ऐसा करने की आवश्यकता क्यों होगी? – Oded
सी ++ में वैश्विक स्थिर वस्तु का सीटीआर मुख्य() से पहले चलाया जा सकता है। – seand
ओडेड के प्रश्न को दोबारा शुरू करने के लिए: हमें बताएं कि आप * प्राप्त करना चाहते हैं * और हम आपको बताएंगे कि इसे कैसे प्राप्त किया जाए, शायद 'मुख्य' को बाधित किए बिना। (अधिक विशेष रूप से: कुछ बेहतर है। सी ज्ञान की मेरी कमी मुझे आपकी मदद करने से रोकती है।) – MvanGeest