2009-02-26 5 views
5

यदि मैं स्थिर रूप से उबंटू में निष्पादन योग्य लिंक करता हूं, तो क्या कोई मौका है कि निष्पादन योग्य अन्य वितरण जैसे कि टकसाल ओएस के भीतर काम नहीं करेगा? या फेडोरा? मुझे पता है कि प्रोसेसर के प्रकार प्रभावित होते हैं, लेकिन फिर कुछ और है जो मुझे सावधान रहना है? क्षमा करें अगर यह एक बेकार सवाल है। किसी भी मदद के लिए धन्यवादएक यूनिक्स वितरण कार्य पर स्थैतिक लिंकिंग करेगा लेकिन दूसरा नहीं?

+0

अच्छा सवाल। मैंने आज के बारे में सोचा। – TheHippo

+1

"यूनिक्स" द्वारा, क्या आप वाकई "लिनक्स" का मतलब नहीं रखते हैं? – bk1e

उत्तर

3

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

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

+1

यह गलत जवाब है, खासकर लिनक्स पर। यदि यह उत्तर "जीतता है", तो stackoverflow व्यर्थ है :-( –

+0

-1: खेल पर केवल कंप्यूटर आर्किटेक्चर से कहीं अधिक है। –

+0

मैं मिसपोक करता हूं, जब मैंने "आर्किटेक्चर" लिखा था, तो मुझे बस चिप वास्तुकला से ज्यादा ध्यान में था। मैंने इसे दोहराया इसे थोड़ा बेहतर बनाने के लिए। –

2

ज्यादातर मामलों में, आपका निष्पादन योग्य ठीक काम करेगा। जब तक आपका निष्पादन योग्य कार्य करने के लिए मौजूद असामान्य चीज़ पर निर्भर न हो, तब तक कोई समस्या नहीं होगी। जब तक (और, यदि कुछ असामान्य मौजूद होने पर निर्भर करता है, तो आप एक ही मुद्दा भले ही आप गतिशील रूप से लिंक करना होगा।)

स्थिरता जोड़ने आमतौर पर सुरक्षित की तुलना में गतिशील रूप से विभिन्न यूनिक्स वातावरण के बीच संगतता के लिए जोड़ने है, एक ही सीपीयू उपयोग में है।

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

तो लोग नियमित रूप से लिंक क्यों करते हैं? दो कारण हैं:

  • यह निष्पादन योग्य बड़ा बनाता है, कभी कभी बहुत बड़ा है, और
  • पुस्तकालयों में बग ठीक कर रहे हैं, तो आप बग फिक्स करने के लिए पहुँच प्राप्त करने के अपने कार्यक्रम पुनः लिंक करना होगा। यदि पुस्तकालयों में एक महत्वपूर्ण सुरक्षा बग तय किया गया है, तो आपको अपने exe को फिर से जोड़ना और पुनः वितरित करना होगा।
5

कुछ कोने के मामले हैं, लेकिन अधिकांश भाग के लिए, आपको स्थिर लिंकिंग के साथ अच्छे आकार में होना चाहिए। जो मन में आता है वह libnss है। यह विशेष पुस्तकालय अनिवार्य रूप से लिंक करना अनिवार्य रूप से असंभव है, जिस तरह से यह अपना काम करता है (अनुमतियां, प्रमाणीकरण, सुरक्षा कार्य)। जब तक glibc-version समान होते हैं, तब भी आपको इस समस्या पर ठीक होना चाहिए।

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

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

+0

नया ग्लिबैक आपको चेतावनी देगा यदि आप किसी भी "समस्या" कार्यों को स्थिर रूप से लिंक करते हैं। पूरी सूची खोजने के लिए, आप "stings -a /usr/lib/libc.a | grep 'को स्थिर रूप से कर सकते हैं लिंक किए गए एप्लिकेशन ''। यह मुझे फेडोरा 9 पर 73 कार्यों देता है। इस चेतावनी को अनदेखा न करें, या आप क्रैश और जला देंगे! –

0

इसके विपरीत। वितरण या यहां तक ​​कि ओएसई में काम करने के लिए बाइनरी प्राप्त करने की आपकी जो भी संभावना है, उन संभावनाओं को स्थिर लिंकिंग द्वारा अधिकतम किया जाता है। स्टेटिक लिंकिंग पुस्तकालयों के संदर्भ में एक निष्पादन योग्य आत्मनिर्भर बनाता है। यह अभी भी गलत हो सकता है अगर यह ऐसी फाइल को पढ़ने की कोशिश करता है जो किसी अन्य सिस्टम पर नहीं है।

पोर्टेबिलिटी के बेहतर अवसरों के लिए, dietlibc या किसी अन्य libc के खिलाफ लिंक करने का प्रयास करें। An article at Linux Journal कुछ उम्मीदवारों का उल्लेख करता है। एक छोटी, सरल libc फाइल सिस्टम में चीजों पर निर्भर होने की संभावना कम है जो distro से distro से अलग है।

+0

+1 यह इंगित करने के लिए कि एक छोटे libc का उपयोग करना अक्सर एक अच्छा विकल्प होता है। विशेष रूप से यदि आप एक का उपयोग करते हैं ग्लिबैक के बाद से बहुत सारी सुविधाएं काफी विशाल हैं, आपको बड़ी बाइनरी मिल जाएगी। –

0

मैं ऊपर बताए गए कारणों से स्थिर रूप से कुछ जोड़ने से बचने के लिए, जब तक कि आप बिल्कुल अवश्य न हों।

कहा जा रहा है, यह एक ही वास्तुकला के किसी भी अन्य समान कर्नेल पर काम करना चाहिए (यानी अगर आप स्थिर linux 2.4.x चल रहा एक मशीन पर लिंक, लोडर VDSO linux 2.6 पर अलग होने जा रहा है, VDSO आभासी किया जा रहा है गतिशील साझा ऑब्जेक्ट, एक साझा ऑब्जेक्ट जो कर्नेल लोडर कोड वाली प्रत्येक प्रक्रिया में प्रकट होता है)।

अन्य नुकसान में/आदि नहीं किया जा रहा है, जहां आपको लगता है चाहते हैं, लॉग विभिन्न स्थानों में किया जा रहा है, प्रणाली अनुपस्थित या अलग किया जा रहा है उपयोगिताओं बातें शामिल हैं, आदि (ubuntu अद्यतन-rc.d, RHEL का उपयोग करता है chkconfig उपयोग करता है)

कभी-कभी आपके पास कोई विकल्प नहीं होता है। मैं एक प्रोग्राम लिख रहा था जो execv() का उपयोग करने के पक्ष में LVM2 के स्ट्रिंग आधारित cmdlib इंटरफ़ेस से बात करता था .. कम और देखें, मुझे समर्थन करने के लिए आवश्यक distros का 30% उस पुस्तकालय को शामिल नहीं किया गया था और इसे प्राप्त करने का कोई तरीका नहीं था। इसलिए, मुझे बाइनरी पैकेजों का उत्पादन करते समय स्थिर वस्तु के खिलाफ लिंक करना पड़ा।

आप glibc का उपयोग कर रहे हैं, तो आप विश्वास है कि() getpwnam की तरह सामान और दोस्तों अभी भी काम करेगा हो सकता है .. बस

0
(उन्हें रन टाइम पर विन्यास बनाने के बेहतर अभी तक,) किसी भी कठिन कोडित पथ को देखने के लिए सुनिश्चित कर लें

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

चेतावनी दीजिये कि आप जीएलबीबीसी के कुछ हिस्सों को स्थिर रूप से लिंक नहीं कर सकते हैं, इसलिए यदि आप उनका उपयोग कर रहे हैं तो आपको किसी भी तरह से गतिशील रूप से लिंक करना होगा। स्मृति से नाम सेवा सामान (एनएसएस) भागों को डायनामिक लिंकिंग की आवश्यकता होती है जब मैं इसकी जांच कर रहा था।

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

0

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

लिनक्स मानक आधार मार्ग का पालन करें, यह संभवतः जितना संभव हो उतना क्रॉस वितरण पोर्टेबिलिटी प्राप्त करने का एकमात्र मौका है।

यदि आप फ्रीबीएसडी और सोलारिस के लिए प्रोग्राम करते हैं तो एलएसबी भी ठीक काम करता है।

0

यहां समस्या पर दो संगतता प्रश्न हैं: लाइब्रेरी संस्करण और लाइब्रेरी सूची।

आप यह नहीं कहते कि आप कौन सी लाइब्रेरी का उपयोग कर रहे हैं।

यदि आपके पास कोई '-l' विकल्प नहीं है, तो केवल 'लाइब्रेरी' ग्लिब स्वयं है, जो कर्नेल के इंटरफ़ेस के रूप में कार्य करता है। ग्लिब संस्करण ऊपर संगत हैं। यदि आप एक glibc 2.x सिस्टम से लिंक करते हैं तो आप y> x के लिए एक glibc 2.y पर चला सकते हैं। डेवलपर्स इसके लिए एक दृढ़ प्रतिबद्धता बनाते हैं।

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

संबंधित मुद्दे