लिंकर (कंप्यूटिंग)

कम्प्यूटिंग में, एक लिंकर या लिंक एडिटर एक कंप्यूटर सिस्टम सॉफ्टवेयर है जो एक या एक से अधिक वस्तु फ़ाइल (संकलक या असेंबलर (कंप्यूटिंग) द्वारा उत्पन्न) लेता है और उन्हें एक निष्पादन योग्य फ़ाइल, पुस्तकालय (कम्प्यूटिंग) फ़ाइल, या अन्य ऑब्जेक्ट में जोड़ता है। फ़ाइल।

एक सरल संस्करण जो अपने इनपुट/आउटपुट को सीधे स्मृति में लिखता है, उसे लोडर कहा जाता है, हालांकि लोडर (कंप्यूटिंग) को आमतौर पर एक अलग प्रक्रिया माना जाता है।

सिंहावलोकन
कंप्यूटर प्रोग्राम आमतौर पर कई भागों या मॉड्यूल से बने होते हैं; इन भागों/मॉड्यूल को एक ऑब्जेक्ट फ़ाइल के भीतर समाहित करने की आवश्यकता नहीं है, और ऐसे मामलों में डिबग प्रतीक के माध्यम से एक दूसरे को दूसरे मॉड्यूल में पतों के रूप में संदर्भित करते हैं, जो निष्पादन के लिए लिंक किए जाने पर मेमोरी पतों में मैप किए जाते हैं।

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

आमतौर पर, एक ऑब्जेक्ट फ़ाइल में तीन प्रकार के प्रतीक हो सकते हैं:


 * परिभाषित बाहरी प्रतीक, जिन्हें कभी-कभी सार्वजनिक या प्रवेश प्रतीक कहा जाता है, जो इसे अन्य मॉड्यूल द्वारा बुलाए जाने की अनुमति देते हैं,
 * अपरिभाषित बाहरी प्रतीक, जो अन्य मॉड्यूल को संदर्भित करते हैं जहां इन प्रतीकों को परिभाषित किया गया है, और
 * स्थानीय प्रतीकों, आंतरिक रूप से स्थानांतरण (कंप्यूटर विज्ञान) की सुविधा के लिए ऑब्जेक्ट फ़ाइल के भीतर उपयोग किया जाता है।

अधिकांश कंपाइलरों के लिए, प्रत्येक ऑब्जेक्ट फ़ाइल एक इनपुट स्रोत कोड फ़ाइल को संकलित करने का परिणाम है। जब एक प्रोग्राम में कई ऑब्जेक्ट फ़ाइलें होती हैं, तो लिंकर इन फ़ाइलों को एक एकीकृत निष्पादन योग्य प्रोग्राम में जोड़ता है, प्रतीकों को हल करने के साथ-साथ।

लिंकर्स लाइब्रेरी (कंप्यूटिंग) या क्रम पुस्तकालय नामक संग्रह से ऑब्जेक्ट ले सकते हैं। अधिकांश लिंकर्स आउटपुट में पूरी लाइब्रेरी को शामिल नहीं करते हैं; उनमें केवल फाइलें शामिल हैं जो अन्य ऑब्जेक्ट फाइलों या पुस्तकालयों द्वारा संदर्भित हैं। लाइब्रेरी लिंकिंग इस प्रकार एक पुनरावृत्त प्रक्रिया हो सकती है, जिसमें कुछ संदर्भित मॉड्यूल को जोड़ने के लिए अतिरिक्त मॉड्यूल की आवश्यकता होती है, और इसी तरह। पुस्तकालय विविध उद्देश्यों के लिए मौजूद हैं, और एक या अधिक सिस्टम लाइब्रेरी आमतौर पर डिफ़ॉल्ट रूप से जुड़े होते हैं।

लिंकर प्रोग्राम आधार पता स्पेस में ऑब्जेक्ट्स को व्यवस्थित करने का भी ध्यान रखता है। इसमें कोड को स्थानांतरित करना शामिल हो सकता है जो एक विशिष्ट आधार पते को दूसरे आधार में मानता है। चूंकि एक कंपाइलर शायद ही कभी जानता है कि कोई ऑब्जेक्ट कहां रहेगा, यह अक्सर एक निश्चित आधार स्थान (उदाहरण के लिए, शून्य आधार) मानता है। मशीन कोड को स्थानांतरित करने में पूर्ण छलांग, लोड और स्टोर का पुन: लक्ष्यीकरण शामिल हो सकता है।

लिंकर द्वारा निष्पादन योग्य आउटपुट को एक और स्थानांतरण पास की आवश्यकता हो सकती है जब इसे अंत में मेमोरी में लोड किया जाता है (निष्पादन से ठीक पहले)। यह पास आमतौर पर अप्रत्यक्ष स्मृति प्रदान करने वाले कम्पुटर के वो भाग जिसे छूकर मेहसूस किया जा सके पर छोड़ दिया जाता है: प्रत्येक प्रोग्राम को अपने स्वयं के पता स्थान में रखा जाता है, इसलिए कोई विरोध नहीं होता है, भले ही सभी प्रोग्राम एक ही आधार पते पर लोड हों। निष्पादन योग्य स्थिति स्वतंत्र निष्पादन योग्य होने पर यह पास भी छोड़ा जा सकता है।

सिंट्रान III जैसे कुछ यूनिक्स प्रकारों पर, एक लिंकर (ऑब्जेक्ट फ़ाइलों को एक प्रोग्राम में असेंबल करना) द्वारा की जाने वाली प्रक्रिया को लोडर (कंप्यूटिंग) कहा जाता था (जैसा कि फ़ाइल पर निष्पादन योग्य कोड लोड करने में होता है)। इसके अतिरिक्त, कुछ ऑपरेटिंग सिस्टम में, एक ही प्रोग्राम एक प्रोग्राम (गतिशील जुड़ाव) को जोड़ने और लोड करने के दोनों कार्यों को संभालता है।

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

यह दृष्टिकोण दो लाभ प्रदान करता है:


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

इसके नुकसान भी हैं:

कंटेनरीकरण (कंप्यूटिंग) या ओएस-स्तरीय वर्चुअलाइजेशन वातावरण सिस्टम प्रशासक को इन व्यक्तिगत पेशेवरों और विपक्षों को कम करने या व्यापार करने की अनुमति दे सकता है।
 * खिड़कियाँ प्लेटफॉर्म पर DLL नरक के रूप में जाना जाता है, एक असंगत अपडेटेड लाइब्रेरी एक्जीक्यूटिव को तोड़ देगी जो लाइब्रेरी के पिछले संस्करण के व्यवहार पर निर्भर करती है यदि नया संस्करण सही ढंग से बैकवर्ड संगत नहीं है।
 * एक प्रोग्राम, इसके द्वारा उपयोग किए जाने वाले पुस्तकालयों के साथ, पैकेज के रूप में प्रमाणित हो सकता है (उदाहरण के लिए शुद्धता, दस्तावेज़ीकरण आवश्यकताओं, या प्रदर्शन के रूप में), लेकिन यदि घटकों को प्रतिस्थापित नहीं किया जा सकता है (यह महत्वपूर्ण सिस्टम में स्वचालित ओएस अपडेट के खिलाफ भी तर्क देता है; दोनों ही मामलों में, ओएस और पुस्तकालय एक योग्य वातावरण का हिस्सा बनते हैं)।

स्टेटिक लिंकिंग
स्टैटिक लिंकिंग प्रोग्राम में उपयोग किए जाने वाले सभी लाइब्रेरी रूटीन को निष्पादन योग्य छवि में कॉपी करने वाले लिंकर का परिणाम है। डायनेमिक लिंकिंग की तुलना में इसके लिए अधिक डिस्क स्थान और मेमोरी की आवश्यकता हो सकती है, लेकिन यह अधिक पोर्टेबल है, क्योंकि इसे उस सिस्टम पर डायनेमिक-लिंक लाइब्रेरी की उपस्थिति की आवश्यकता नहीं है जहां यह चलता है। स्टेटिक लिंकिंग डीएलएल नरक को भी रोकता है, क्योंकि प्रत्येक प्रोग्राम में लाइब्रेरी रूटीन के ठीक उसी संस्करण को शामिल किया जाता है जिसकी उसे आवश्यकता होती है, जिसमें अन्य कार्यक्रमों के साथ कोई विरोध नहीं होता है। एक लाइब्रेरी से केवल कुछ रूटीन का उपयोग करने वाले प्रोग्राम को पूरे लाइब्रेरी को स्थापित करने की आवश्यकता नहीं होती है।

स्थान परिवर्तन
चूंकि कंपाइलर के पास अंतिम आउटपुट में ऑब्जेक्ट्स के लेआउट के बारे में कोई जानकारी नहीं है, यह छोटे या अधिक कुशल निर्देशों का लाभ नहीं उठा सकता है जो किसी अन्य ऑब्जेक्ट के पते पर आवश्यकता रखता है। उदाहरण के लिए, एक जंप निर्देश एक पूर्ण पते या वर्तमान स्थान से ऑफ़सेट का संदर्भ दे सकता है, और ऑफ़सेट को लक्ष्य की दूरी के आधार पर अलग-अलग लंबाई के साथ व्यक्त किया जा सकता है। पहले सबसे रूढ़िवादी निर्देश (आमतौर पर प्लेटफॉर्म के आधार पर सबसे बड़ा सापेक्ष या पूर्ण संस्करण) उत्पन्न करके और विश्राम संकेत जोड़कर, अंतिम लिंक के दौरान छोटे या अधिक कुशल निर्देशों को प्रतिस्थापित करना संभव है। जंप ऑप्टिमाइज़ेशन के संबंध में इसे स्वचालित जंप-साइज़िंग भी कहा जाता है। यह चरण केवल सभी इनपुट ऑब्जेक्ट्स को पढ़ने और अस्थायी पते असाइन करने के बाद ही किया जा सकता है; लिंकर छूट पास बाद में पतों को पुन: असाइन करता है, जो बदले में अधिक संभावित छूट देने की अनुमति दे सकता है। सामान्य तौर पर, प्रतिस्थापित अनुक्रम छोटे होते हैं, जो इस प्रक्रिया को वस्तुओं के एक निश्चित क्रम को देखते हुए हमेशा सर्वोत्तम समाधान पर अभिसरण करने की अनुमति देता है; यदि ऐसा नहीं होता है, तो रियायतें संघर्ष कर सकती हैं, और लिंकर को किसी भी विकल्प के लाभों को तौलना होगा।

जबकि निर्देश छूट आमतौर पर लिंक-टाइम पर होती है, संकलन-समय पर अनुकूलन प्रक्रिया के हिस्से के रूप में आंतरिक-मॉड्यूल छूट पहले से ही हो सकती है। कुछ मामलों में, स्थानांतरण प्रक्रिया के हिस्से के रूप में लोड-समय पर विश्राम भी हो सकता है या गतिशील मृत-कोड उन्मूलन तकनीकों के साथ संयुक्त हो सकता है।

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

इसका एक फायदा यह है कि यह एक प्रोग्राम को सभी इंटरमीडिएट ऑब्जेक्ट फ़ाइलों को रखने के बिना बनाए रखने की अनुमति देता है, या बिना बदले हुए प्रोग्राम अनुभागों को फिर से संकलित किए बिना। यह प्रोग्राम अपडेट को छोटी फाइलों (मूल रूप से कार्ड डेक (कंप्यूटिंग) एस) के रूप में वितरित करने की अनुमति देता है, जिसमें केवल ऑब्जेक्ट मॉड्यूल को प्रतिस्थापित किया जाता है। ऐसी प्रणालियों में, ऑब्जेक्ट कोड 80-बाइट पंच-कार्ड छवियों के रूप और प्रारूप में होता है, ताकि उस माध्यम का उपयोग करके सिस्टम में अपडेट पेश किए जा सकें। OS/360 के बाद के रिलीज और बाद के सिस्टम में, लोड-मॉड्यूल में अद्यतनों का पता लगाने योग्य रिकॉर्ड बनाने के लिए घटक मॉड्यूल के संस्करणों के बारे में अतिरिक्त डेटा होता है। यह पहले से लिंक किए गए लोड मॉड्यूल से एक ओवरले (प्रोग्रामिंग) संरचना को जोड़ने, बदलने या हटाने की भी अनुमति देता है।

लिंकेज एडिटर शब्द का अर्थ यह नहीं लगाया जाना चाहिए कि प्रोग्राम टेक्स्ट एडिटर की तरह यूजर-इंटरैक्टिव मोड में संचालित होता है। यह बैच-मोड निष्पादन के लिए अभिप्रेत है, उपयोगकर्ता द्वारा अनुक्रमिक रूप से व्यवस्थित फ़ाइलों में संपादित किए जा रहे संपादन आदेशों के साथ, जैसे कि छिद्रित कार्ड, डायरेक्ट-एक्सेस स्टोरेज डिवाइस, या चुंबकीय टेप, और टेप का उपयोग अक्सर OS की प्रारंभिक स्थापना के दौरान किया जाता था।.

लिंकेज एडिटिंग (IBM नामकरण) या समेकन या संग्रह (इंटरनेशनल कंप्यूटर लिमिटेड नामकरण) लिंकेज संपादक या समेकनकर्ता के विभिन्न टुकड़ों को पुनर्स्थापन योग्य बाइनरी में संयोजित करने के कार्य को संदर्भित करता है, जबकि लक्ष्य पते पर एक पूर्ण बाइनरी में लोडिंग और स्थानांतरण को सामान्य रूप से माना जाता है। एक अलग कदम।

सामान्य कार्यान्वयन
यूनिक्स और यूनिक्स जैसी प्रणालियों पर, लिंकर को एलडी के रूप में जाना जाता है। एलडी नाम की उत्पत्ति लोडर और लिंक ईडिटर हैं। लिंकिंग की प्रक्रिया के दौरान अन्य कार्यक्रमों से बाहरी प्रतीकों को लोड करने की प्रक्रिया का वर्णन करने के लिए लोडर शब्द का उपयोग किया गया था।

जीएनयू लिंकर
जीएनयू लिंकर (या जीएनयू एलडी) यूनिक्स कमांड एलडी का जीएनयू परियोजना का मुफ्त सॉफ्टवेयर कार्यान्वयन है। जीएनयू एलडी लिंकर चलाता है, जो एक सॉफ्टवेयर प्रोजेक्ट के संकलन के दौरान बनाई गई ऑब्जेक्ट फाइलों से निष्पादन योग्य फ़ाइल (या लाइब्रेरी) बनाता है। लिंकिंग प्रक्रिया पर अधिक नियंत्रण रखने के लिए एक लिंकर स्क्रिप्ट जीएनयू एलडी को पास की जा सकती है। जीएनयू लिंकर जीएनयू बाइनरी यूटिलिटीज (बिनुटिल्स) का हिस्सा है। बिनुटिल्स में एलडी के दो संस्करण प्रदान किए गए हैं: पारंपरिक जीएनयू एलडी बाइनरी फाइल डिस्क्रिप्टर लाइब्रेरी पर आधारित है, और एक सुव्यवस्थित ईएलएफ-ओनली वर्जन जिसे सोना (लिंकर) कहा जाता है।

जीएनयू एलडी की कमांड-लाइन और लिंकर स्क्रिप्ट सिंटैक्स अधिकांश यूनिक्स जैसी दुनिया में वास्तविक मानक है। एलएलवीएम परियोजना का लिंकर,lld, ड्रॉप-इन संगत होने के लिए डिज़ाइन किया गया है, और सीधे जीएनयू कंपाइलर के साथ इस्तेमाल किया जा सकता है। एक और ड्रॉप-इन रिप्लेसमेंट, मोल्ड, एक अत्यधिक समानांतर और तेज़ विकल्प है जो GNU टूल द्वारा भी समर्थित है।

यह भी देखें

 * बाइनरी फाइल डिस्क्रिप्टर लाइब्रेरी (libbfd)
 * कंपाइल एंड गो सिस्टम
 * डीएलएल नरक
 * प्रत्यक्ष बंधन
 * डायनेमिक बाइंडिंग (कंप्यूटिंग)
 * गतिशील मृत कोड उन्मूलन
 * गतिशील प्रेषण
 * गतिशील पुस्तकालय
 * गतिशील लिंकर
 * गतिशील लोडिंग
 * डायनामिक-लिंक लाइब्रेरी
 * बाहरी चर
 * पुस्तकालय (कम्प्यूटिंग)
 * लोडर (कंप्यूटिंग)
 * नाम सजावट
 * प्रीलिंकिंग (प्रीबाइंडिंग)
 * स्थानांतरण (कंप्यूटिंग)
 * स्मार्ट लिंकिंग
 * स्टेटिक लाइब्रेरी
 * सोना (लिंकर)

आगे की पढाई

 * Code: Errata:
 * (19 pages)
 * Code: Errata:
 * (19 pages)
 * (19 pages)

इस पेज में लापता आंतरिक लिंक की सूची

 * कोडांतरक (कम्प्यूटिंग)
 * सोर्स कोड
 * कंप्यूटर का प्रदर्शन
 * डीएलएल नरक
 * पिछड़ा संगत
 * कार्यकारी प्रबंधक
 * डिस्क भंडारण
 * संकलन समय
 * लोड होने का समय
 * गतिशील डेड-कोड उन्मूलन
 * UNIX- जैसे
 * नाम की सजावट

बाहरी कड़ियाँ

 * Ian Lance Justin's Linkers blog entries
 * Linkers and Loaders, a Linux Journal article by Sandeep Grover
 * Another Listing of Where to Get a Complete Collection of Free Tools for Assembly Language Development
 * GNU linker manual
 * LLD - The LLVM Linker