linux - लिनक्स स्थिर लिंकिंग मर चुका है?




gcc glibc (4)

उस तथ्य के बारे में क्या लिनक्स पर पूर्ण-कार्यशील स्थिर निर्माण बनाने के लिए अब कोई उचित तरीका है या लिनक्स पर स्थिर लिंकिंग पूरी तरह से मर चुकी है?

मुझे नहीं पता कि ऐतिहासिक संदर्भ कहां मिलें, लेकिन हां, जीएनयू सिस्टम पर स्थैतिक लिंकिंग मर गई है। (मेरा मानना ​​है कि यह libc4 / libc5 से libc6 / glibc 2.x में संक्रमण के दौरान मृत्यु हो गई।)

इस सुविधा को प्रकाश में बेकार समझा गया था:

  • सुरक्षा भेद्यताएं। आवेदन जो स्थिर रूप से जुड़ा हुआ था, libc के अपग्रेड का भी समर्थन नहीं करता है। यदि ऐप को लिब कमजोरता वाले सिस्टम पर जोड़ा गया था तो यह स्थिर रूप से जुड़े निष्पादन योग्य के भीतर कायम रखा जा रहा है।

  • कोड ब्लोट। यदि एक ही सिस्टम पर कई स्थैतिक रूप से जुड़े अनुप्रयोग चलाए जाते हैं, तो मानक पुस्तकालयों का पुन: उपयोग नहीं किया जाएगा, क्योंकि प्रत्येक एप्लिकेशन में सबकुछ की अपनी प्रतिलिपि होती है। (समस्या की सीमा को समझने के लिए du -sh /usr/lib का प्रयास करें।)

10-15 साल पहले एलकेएमएल और ग्लिब मेल मेल अभिलेखागार खोदने का प्रयास करें। मुझे यकीन है कि बहुत पहले मैंने एलकेएमएल पर कुछ देखा है।

वास्तव में, लिनक्स पर स्टेटिक जीसीसी ध्वज अब काम नहीं करता है। मुझे जीएनयू libc से उद्धरण दें FAQ:

2.22। यहां तक ​​कि स्थैतिक रूप से जुड़े कार्यक्रमों को कुछ साझा पुस्तकालयों की आवश्यकता होती है जो मेरे लिए स्वीकार्य नहीं है। मैं क्या कर सकता हूँ?

{AJ} एनएसएस (विवरण के लिए बस 'info libc' नाम सेवा स्विच '' टाइप करें) साझा पुस्तकालयों के बिना ठीक से काम नहीं करेगा। एनएसएस किसी भी प्रोग्राम को रिलिकिंक किए बिना एक कॉन्फ़िगरेशन फ़ाइल (/etc/nsswitch.conf) को बदलकर विभिन्न सेवाओं (जैसे एनआईएस, फाइल, डीबी, hesiod) का उपयोग करने की अनुमति देता है। एकमात्र नुकसान यह है कि अब स्थिर पुस्तकालयों को साझा पुस्तकालयों तक पहुंचने की आवश्यकता है। यह जीएनयू सी पुस्तकालय द्वारा पारदर्शी रूप से संभाला जाता है।

एक समाधान है - glable-static-nss के साथ glibc को विन्यस्त करना। इस मामले में आप एक स्थिर बाइनरी बना सकते हैं जो केवल सेवाओं डीएनएस और फाइलों का उपयोग करेगा (इसके लिए /etc/nsswitch.conf बदलें)। आपको इन सभी सेवाओं के खिलाफ स्पष्ट रूप से लिंक करने की आवश्यकता है। उदाहरण के लिए:

 gcc -static test-netdb.c -o test-netdb \
   -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group

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

उस तथ्य के बारे में क्या लिनक्स पर पूर्ण-कार्यशील स्थिर निर्माण बनाने के लिए अब कोई उचित तरीका है या लिनक्स पर स्थिर लिंकिंग पूरी तरह से मर चुकी है? मेरा मतलब स्थिर निर्माण है जो:

  • गतिशील निर्माण के समान ही वैसे ही व्यवहार करता है (असंगत व्यवहार के साथ स्थिर-एनएसएस बुरा है!);
  • ग्लिब पर्यावरण और लिनक्स संस्करणों के उचित बदलावों पर काम करता है;

अन्य उत्तरों पर जोड़ना:

अन्य उत्तरों में बताए गए कारणों के कारण, अधिकांश लिनक्स वितरणों के लिए इसकी अनुशंसा नहीं की जाती है, लेकिन वास्तव में ऐसे वितरण होते हैं जो विशेष रूप से स्थिर रूप से जुड़े बाइनरी चलाने के लिए बनाए जाते हैं:

स्टाली विवरण से:

स्थैतिक लिनक्स प्रत्येक कार्य के लिए सर्वोत्तम उपकरणों के हाथ से चयनित संग्रह पर आधारित होता है और प्रत्येक उपकरण को स्थिर रूप से लिंक किया जाता है (कुछ एक्स क्लाइंट जैसे सेंट, सर्फ, dwm, dmenu),

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

साइड-लाभ के कारण स्थिर रूप से जुड़े बाइनरी तेजी से शुरू होते हैं, वितरण प्रदर्शन लाभ को भी लक्षित करता है।

स्थिर रूप से जोड़ने से निर्भरता में कमी के लिए भी मदद मिलती है।

स्थिर बनाम गतिशील लिंकिंग के बारे में आप इस प्रश्न में इसके बारे में और अधिक पढ़ सकते हैं।


लिनक्स की दुनिया में स्टेटिक लिंकिंग ज्यादा प्यार नहीं लगती है। मेरा लेना यहाँ है।

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

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

अन्य दृष्टिकोणों से वहां असहमत होने के लिए बहुत कुछ है, और यह अच्छा है कि ओपन सोर्स सॉफ़्टवेयर उन सभी के लिए अनुमति देता है।


सिर्फ इसलिए कि आपको गतिशील रूप से एनएसएस सेवा से लिंक करना है, इसका मतलब यह नहीं है कि आप किसी अन्य पुस्तकालय से स्थिर रूप से लिंक नहीं कर सकते हैं । वह सभी एफएक्यू कह रहा है कि यहां तक ​​कि "स्थैतिक रूप से" जुड़े कार्यक्रमों में कुछ गतिशील रूप से जुड़े पुस्तकालय भी हैं। यह नहीं कह रहा है कि स्थिर लिंकिंग "असंभव" है या यह "काम नहीं करती" है।





static-linking