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



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

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

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

बहुधा, एक वस्तु फ़ाइल में तीन प्रकार के प्रतीक हो सकते हैं:


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

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

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

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

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

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

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

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


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


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

इसकी हानिया भी हैं:

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

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

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

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

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

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

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

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

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

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

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

यह भी देखें

 * बाइनरी फाइल डिस्क्रिप्टर लाइब्रेरी (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