यदि लिंक करने के लिए कुछ भी नहीं है (यानी .. मैं किसी भी पुस्तकालय का उपयोग नहीं कर रहा हूं। मुझे पता है कि यह किसी भी उपयोग का नहीं होगा।) क्या लिंकर असेंबलर के ऑब्जेक्ट कोड आउटपुट को बदल देगा? यदि ऐसा है तो यह क्या बदलता है?
यह हमेशा कुछ प्रारंभिक कोड को लिंक करता है। आप इसे आज़मा सकते हैं, एक खाली प्रोग्राम लिख सकते हैं और इसे लिंक कर सकते हैं, और फिर इसे अलग करने के लिए objdump -d का उपयोग करें।
मैंने सुना है कि LINKER कुछ स्मृति मैपिंग का संचालन भी करता है। मुझे समझ में नहीं आता कि कैसे। कार्यक्रम नहीं चल रहा है, यह सिर्फ विनिर्माण चरण में है। लिंकर मेमोरी को कैसे मैप कर सकता है? यह कैसा दिखता है? LINKER के सभी कार्य क्या हैं?
प्रत्येक सिस्टम में मेमोरी लेआउट होता है जो निष्पादन योग्य प्रोग्रामों को काम पर चलना चाहिए। यह निर्दिष्ट करता है कि कार्यक्रम के विभिन्न हिस्सों कहां जाते हैं (कम से कम कोड, प्रारंभिक डेटा, डेटा शून्य पर प्रारंभ किया गया)। लिंकर को इन नियमों के अनुसार निष्पादन योग्य उत्पादन करना होगा, जो सिस्टम के बीच भिन्न होता है, उदा। विंडोज और लिनक्स।एम्बेडेड सिस्टम पर यह और भी दिलचस्प हो जाता है, वहां प्रोग्राम आम तौर पर केवल पढ़ने योग्य मेमोरी (फ्लैश) में होता है और डेटा रैम में होता है, और माइक्रोकंट्रोलर के प्रकार के आधार पर विभिन्न प्रकार की मेमोरी के लिए निश्चित पता श्रेणी होती है।
जब लोग "स्थानांतरण", "पता बाध्यकारी" का संदर्भ लेते हैं। मैं वास्तव में उनका मतलब क्या नहीं मिलता है। यह & क्या है इसका उद्देश्य क्या है?
सामान्य रूप से बाध्यकारी का अर्थ किसी नाम को मूल्य देना है, इस मामले में किसी फ़ंक्शन या वैश्विक चर के प्रतीक के लिए एक पता।
स्थानांतरित करने के लिए, आप आम तौर पर एक से अधिक ऑब्जेक्ट फ़ाइल को एक साथ जोड़ते हैं, और प्रत्येक ऑब्जेक्ट फ़ाइल अपने पते को इसके आरंभ से संबंधित ऑफ़सेट के रूप में निर्दिष्ट करती है। जब आप उन्हें एक साथ रखते हैं तो प्रत्येक को अपना पता सीमा मिल जाती है, और लिंकर पता सीमा में ऑफ़सेट मैप करके प्रतीक के लिए पते की गणना करता है। इसे स्थानांतरण कहा जाता है।
कुछ डीबगर्स इस तरह की जानकारी दिखाते हैं: कॉल स्टैक: 0xfffef32, 0xf3234fe आदि .. यह रन टाइम सही है? या लिंकर के तथाकथित "मेमोरी मैपिंग" के मेमोरी पते हैं?
वह 0xfffef32 स्टैक पर एक सामान्य पता होगा, क्योंकि स्टैक आमतौर पर स्मृति के शीर्ष पर रखा जाता है और नीचे की ओर बढ़ता है। स्टैक का उपयोग वापसी पते, स्थानीय चर और वास्तविक फ़ंक्शन पैरामीटर के लिए किया जाता है। ये स्थानीय हैं और स्टैक पॉइंटर से संबंधित पते पर संग्रहीत हैं, इसलिए उन्हें आमतौर पर लिंकर द्वारा नियंत्रित नहीं किया जाता है, बल्कि संकलक पहले से ही ऑफसेट को उपयोग करने के लिए जानता है और उन्हें असेंबली कोड में रखता है।
जब लोग प्रतीकों या प्रतीक तालिका की तरह कुछ संदर्भित करते हैं। क्या उनका मतलब पहचानकर्ता (परिवर्तनीय नाम, निरंतर नाम, फ़ंक्शन नाम) हैं?
प्रतीक तालिका एक सारणी है जो मूल्यों (संख्याओं, ऑफसेट, पते) के प्रतीक को मानचित्र करती है। आपके पहचानकर्ताओं के लिए कुछ प्रतीक हैं, लेकिन अन्य उपयोगों के लिए भी अधिक कुछ हैं। आपके पहचानकर्ताओं को प्रतीक बनने के लिए अधिक या कम संशोधित किया जा सकता है, अधिकांशतः नाम झड़पों को रोकने के लिए (उदा। "_" की पूर्ति)।
लिंकर के पास प्रतीक तालिका मुद्रित करने के लिए एक विकल्प - प्रिंट-मानचित्र है। यदि आप लिंकिंग के लिए जीसीसी का उपयोग करते हैं तो आप -Wl, - प्रिंट-मानचित्र का उपयोग कर सकते हैं।
यदि आपको निम्न स्तर की तकनीकी सामग्री पसंद है तो आपको एम्बेडेड प्रोग्रामिंग पर एक नज़र डालना चाहिए, यानी प्रोग्रामिंग माइक्रोकंट्रोलर जो विभिन्न इलेक्ट्रिक उपकरणों में उपयोग किए जाते हैं। विंडोज़ जैसे डेस्कटॉप सिस्टम के लिए आपको सामान्य रूप से इस तरह के विवरण देखने की आवश्यकता नहीं होती है।
आपके द्वारा उपयोग की जाने वाली भाषा और लिंकर निर्दिष्ट करना उपयोगी होगा। अलग-अलग लिंकर्स थोड़ा अलग काम कर सकते हैं। –