2009-06-23 11 views
10

चूंकि सभी लिनक्स वितरण एक ही कर्नेल का उपयोग करते हैं, क्या उनके निष्पादन योग्य बाइनरी फ़ाइलों के बीच कोई अंतर है?क्या वितरण के बीच निष्पादन योग्य बाइनरी फाइलों के बीच कोई अंतर है?

यदि हां, तो मुख्य अंतर क्या हैं? या इसका मतलब यह है कि हम एक सार्वभौमिक लिनक्स निष्पादन योग्य फ़ाइल बना सकते हैं?

+0

"लिनक्स बाइनरी फाइलों के बारे में कुछ" - इस प्रश्न सारांश में कुछ और सेकंड खर्च करने के बारे में कैसे? – scobi

+0

आप हमेशा किसी और के शीर्षक/प्रश्न को संपादित कर सकते हैं - हालांकि कृपया सावधानी से करें! –

+0

क्या आपका मतलब लिनक्स वितरण या विभिन्न आर्किटेक्चर के पार सार्वभौमिक है ...? – LB40

उत्तर

12

सभी लिनक्स वितरण एक ही द्विपदीय प्रारूप ELF उपयोग करते हैं, लेकिन अभी भी कुछ मतभेद है:

  1. अलग cpu कट्टर विभिन्न अनुदेश सेट का उपयोग करें।
  2. वही सीपीयू आर्क अलग-अलग एबीआई का उपयोग कर सकता है, एबीआई परिभाषित करता है कि पंजीकरण फ़ाइल का उपयोग कैसे करें, नियमित रूप से कॉल/कॉल कैसे करें। अलग-अलग एबीआई एक साथ काम नहीं कर सकता है।
  3. यहां तक ​​कि एक ही आर्क पर, एक ही एबीआई पर, इसका अभी भी मतलब यह नहीं है कि हम एक बाइनरी फ़ाइल को दूसरे वितरण में कॉपी कर सकते हैं। चूंकि अधिकांश बाइनरी फाइलें स्थिर रूप से लिंक नहीं होती हैं, इसलिए वे वितरण के तहत पुस्तकालयों पर निर्भर करती हैं, जिसका अर्थ है कि विभिन्न वितरण पुस्तकालयों के विभिन्न संस्करणों या विभिन्न संकलन विन्यास का उपयोग कर सकते हैं।

तो यदि आप अपने प्रोग्राम को सभी वितरण पर चलाने के लिए चाहते हैं, तो आपको केवल एक संस्करण को लिंक करना पड़ सकता है जो केवल कर्नेल के सिस्कल पर निर्भर करता है, यहां तक ​​कि आप केवल एक निर्दिष्ट आर्क चला सकते हैं।

यदि आप वास्तव में किसी भी कमान पर एक प्रोग्राम चलाने के लिए चाहते हैं, तो आपको सभी मेहराबों के लिए बाइनरी संकलित करना होगा, और सही शुरू करने के लिए एक शेल स्क्रिप्ट का उपयोग करना होगा।

+0

अच्छा जवाब, धन्यवाद! यह प्रश्न –

1

लगभग सभी लिनक्स प्रोग्राम फ़ाइलें ELF मानक का उपयोग करती हैं।

+0

मुझे लगता है कि आपका मतलब है ईएलएफ –

+0

धन्यवाद - उंगली की परेशानी! –

+0

क्या हम किसी भी तरह बाइनरी के ईएलएफ को बदल सकते हैं? –

12

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

अधिकांश बंदरगाहों के पुराने a.out प्रारूप के लिए समर्थन है। (कुछ प्रोसेसर इतने नए हैं कि उनके लिए कभी भी निष्पादन योग्य नहीं हैं।)

कुछ बंदरगाह अन्य निष्पादन योग्य फ़ाइल प्रारूपों का भी समर्थन करते हैं; उदाहरण के लिए, पीए-आरआईएससी पोर्ट में एचपी-यूएक्स के पुराने SOM निष्पादन योग्य के लिए समर्थन है, और μ cLinux (nonmmu) बंदरगाह अपने स्वयं के FLAT प्रारूप का समर्थन करते हैं।

लिनक्स में binfmt_misc भी है, जो उपयोगकर्ताओं को मनमाने ढंग से बाइनरी प्रारूपों के लिए हैंडलर पंजीकृत करने की अनुमति देता है। कुछ वितरण विंडोज, .NET, या जावा अनुप्रयोगों को निष्पादित करने में सक्षम होने के लिए इसका लाभ उठाते हैं - यह वास्तव में अभी भी एक दुभाषिया लॉन्च कर रहा है, लेकिन यह उपयोगकर्ता के लिए पूरी तरह से पारदर्शी है।


लिनक्स अल्फा पर लोड हो रहा है इंटेल बाइनरी, जो em86 एमुलेटर के माध्यम से चलाए जा रहे हैं के लिए समर्थन हासिल है।

qemu-user के साथ चलाने के लिए अन्य आर्किटेक्चर के निष्पादन योग्य के लिए binfmt_misc पंजीकृत करना संभव है।

सिद्धांत रूप में, कोई नया प्रारूप बना सकता है - शायद ईएलएफ में एक नया "आर्किटेक्चर" पंजीकृत करें - वसा बाइनरी के लिए। फिर कर्नेल binfmt लोडर को इस नए प्रारूप के बारे में सिखाया जाना होगा, और आप ld-linux.so गतिशील लिंकर और पूरे निर्माण टूलचेन को याद नहीं करना चाहेंगे। ऐसी सुविधा में थोड़ी दिलचस्पी नहीं है, और जहां तक ​​मुझे पता है, कोई भी इस तरह से कुछ भी काम नहीं कर रहा है।

+0

लेकिन क्या यह सार्वभौमिक लिनक्स बाइनरी बनाना संभव है? –

+0

आपके उत्तर के लिए धन्यवाद –

+0

रनटाइम पर सभी निष्पादन योग्य प्रारूपों को सूचीबद्ध करने का कोई तरीका है, उदा। 'बिल्ली/proc/binfmt'? मैं केवल 'binfmt_misc' वाले को 'ls/proc/sys/fs/binfmt_misc' के साथ सूचीबद्ध कर सकता हूं। मेरे पास सबसे अच्छा स्रोत स्रोत पेड़ पर 'ls fs/binfmt * है। –

1

पुरानी यूनिक्स ने COFF प्रारूप का भी उपयोग किया। आप अभी भी इस प्रारूप में पहले के समय से निष्पादन योग्य पा सकते हैं। लिनक्स के पास अभी भी इसका समर्थन है (हालांकि मुझे नहीं पता कि यह वर्तमान डिस्ट्रोज़ में संकलित है या नहीं)।

+1

लिनक्स के बारे में अधिक स्पष्ट करता है जो सीधे ईएलएफ से बाहर निकलता है। कुछ बंदरगाह * कर्नेल * छवि को कुछ बूटलोडर्स के साथ संगतता के लिए ईसीओएफएफ प्रारूप (एमआईपीएस, पावरपीसी) में बना सकते हैं, और अल्फा में गैर-मूल निष्पादन योग्य के साथ संगतता के लिए सीओएफएफ लोडिंग समर्थन हो सकता है, लेकिन मुझे इसका कोई और निशान नहीं मिल रहा है आधुनिक लिनक्स कर्नेल के स्रोतों में। – ephemient

1

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

स्क्रिप्टिंग भाषाओं में लिखे गए प्रोग्राम निष्पादन समय पर अनुपालन किए जाते हैं, जिसका अर्थ है कि उन्हें हमेशा प्लेटफ़ॉर्म से मिलान करने के लिए संकलित किया जाता है, और इसलिए, हमेशा काम करना चाहिए (यह देखते हुए कि पुस्तकालयों को ठीक से स्थापित किया गया है)।

दूसरी ओर Java में लिखे गए प्रोग्राम, उन्हें वितरित करने से पहले संकलित किए जाते हैं, लेकिन जब तक जावा वीएम स्थापित होता है तब तक किसी भी लिनक्स वितरण पर निष्पादित किया जा सकता है।

इसके अलावा, Java में लिखे गए प्रोग्राम MS Windows और Mac OS जैसे अन्य ऑपरेटिंग सिस्टम पर चल सकते हैं।

Python और Perl में लिखे गए कई कार्यक्रमों के लिए भी यही सच है; हालांकि, क्या Python या Perl प्रोग्राम किसी अन्य ऑपरेटिंग सिस्टम पर काम करेगा, इस कार्यक्रम द्वारा पुस्तकालयों का उपयोग किस प्रकार किया जाता है और क्या ये पुस्तकालय अन्य ऑपरेटिंग सिस्टम पर उपलब्ध हैं।

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