मैक ओएस एक्स और लिनक्स के बीच द्विआधारी संगतता


27

अपने आप को संभालो, इस सवाल की संभावना भोली और / या मूर्खतापूर्ण दिखाई देगी, क्योंकि मैं यूनिक्स के आंतरिक कामकाज, और सामान्य रूप से प्रोग्रामिंग में अपेक्षाकृत नया हूं।

तैयार? ठीक है! जैसे-जैसे मैं साथ बढ़ता जाऊंगा, मैं लगभग 3 स्तरों की ल्युद्रिकता से गुजरता जाऊंगा।


हमारे पास समान हार्डवेयर वाले दो सिस्टम हैं (मुख्य बिंदु प्रोसेसर है, आइए हम मानक इंटेल कोर 2 डुओ कहते हैं)।

एक चल रहा है (अपने लिनक्स डिस्ट्रो को यहां डालें: उबंटू को इसके बाद इस्तेमाल किया जाएगा), और दूसरा चल रहा है मान लीजिए मैक ओएस एक्स।

एक समतुल्य कार्यक्रम संकलित करता है, हमें कुछ इस तरह कहते हैं:

int main()
{
    int cat = 33;
    int dog = 5*cat;
    return dog;
}

कोड बेहद सरल है, क्योंकि मैं अभी तक साझा पुस्तकालयों के निहितार्थ पर विचार नहीं करना चाहता हूं।

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

1.) अगर कोई हमारे उबंटू प्रणाली से उत्पादित फ्लैट बाइनरी को दोबारा बनाने के लिए एक कार्यक्रम विकसित करता था, तो मैक-ओ प्रारूप में, क्या यह मैक ओएस एक्स सिस्टम में चलेगा? फिर, यदि किसी के पास केवल उपरोक्त कार्यक्रम के संकलित बाइनरी थे, और किसी के पास फ्लैट बायनेरिज़ को रीपैकेजिंग करने के लिए यह रहस्यमय उपकरण था, तो क्या मैक ओएस एक्स सिस्टम पर सरल प्रोग्राम चल पाएंगे?


अब हम इसे थोड़ा और आगे ले जाते हैं।

अब हमारे पास स्रोत के साथ एक कार्यक्रम है:

#include <stdio.h>
int main()
{
    printf("I like tortoises, but not porpoises");
    return 0;
}

2.) मान लें कि यह कार्यक्रम संकलित और सांख्यिकीय रूप से जुड़ा हुआ है, तो क्या हमारा जादुई कार्यक्रम अभी भी माच-ओ प्रारूप में कच्चे बाइनरी को फिर से बनाने में सक्षम होगा और क्या यह मैक ओएस एक्स पर काम करेगा? यह देखते हुए कि इसे किसी अन्य बायनेरिज़ पर भरोसा करने की आवश्यकता नहीं होगी, (जिसके लिए मैक सिस्टम इस मामले में नहीं होगा)


और अब अंतिम स्तर के लिए;

3.) क्या होगा यदि हम इस साझा कार्यक्रम का उपयोग सभी आवश्यक साझा पुस्तकालयों को मच-ओ प्रारूप में परिवर्तित करने के लिए करते हैं, और फिर इसके बजाय गतिशील लिंकिंग के साथ ऊपर दिए गए कार्यक्रम को संकलित करें। क्या कार्यक्रम अभी भी चलने में सफल होगा?

यह अभी के लिए होना चाहिए, जाहिर है कि बेहूदाता का प्रत्येक चरण पिछले आधार पर निर्भर करता है, यहां तक ​​कि समझ में भी आता है। इसलिए यदि बहुत पहले खंभे नष्ट हो जाते हैं, तो मुझे संदेह है कि शेष स्तरों के लिए बहुत योग्यता होगी।

मैं निश्चित रूप से गुई के दिमाग में कार्यक्रमों के साथ इस बारे में सोचने के लिए भी नहीं जाऊंगा। विंडिंग सिस्टम की संभावना पूरी तरह से अन्य सिरदर्द होगी। मैं केवल इस स्तर पर कमांड लाइन कार्यक्रमों पर विचार कर रहा हूं।

अब, मैं दुनिया को मुझे सही करने के लिए आमंत्रित करता हूं, और मुझे वह सब कुछ बता देता हूं जो मेरी बेहूदा सोच के साथ गलत है।


: ओएस एक्स binaries के लिए शराब के बराबर डार्लिंग है darling.dolezel.info
strugee

जवाबों:


25

आप एक महत्वपूर्ण बात भूल जाते हैं, जिसका अर्थ है कि आपके कार्यक्रम को कुछ भी दिलचस्प करने के लिए ऑपरेटिंग सिस्टम के साथ बातचीत करनी होगी।

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

और इसलिए यह आगे बढ़ता है। सतह पर क्या लगता है जैसे एक ही काम करना वास्तविक विवरणों में बहुत अलग है।


5
यह मूल रूप से सही है कि समस्या क्या है, लेकिन समस्या वास्तव में लाइब्रेरी नहीं है (जिसे साथ घसीटा जा सकता है), लेकिन सिस्टम कॉल, जो ओएस कर्नेल के लिए अनुरोध हैं। यदि OS संगत सिस्टम कॉल इंटरफ़ेस प्रदान नहीं करता है, तो आप भाग्य से बाहर हैं।
mattdm

1
आह, यह उत्कृष्ट है। यह ठीक उसी तरह का रचनात्मक सुधार है जिसकी मैं उम्मीद कर रहा था। एक गुच्छा धन्यवाद: D क्या आप मुझे इन कथित सिस्टम कॉल्स के बारे में अधिक बता सकते हैं, या मुझे कहीं पर पुनर्निर्देशित कर सकते हैं, मैं उनके बारे में अधिक जान सकता हूं?
zec

3
वे "माना" नहीं हैं, वे वास्तविक हैं। :) यहाँ एक अच्छी शुरुआत है: ibm.com/developerworks/linux/library/l-system-calls
mattdm

7
उस ने कहा, आपका "पागल" विचार पूरी तरह से असंभव नहीं है। बस बहुत काम है। वाइन परियोजना अनिवार्य रूप से लिनक्स (या ओएस एक्स) पर एमएस विंडोज बायनेरी चलाने के लिए है। यह सिस्टम कॉल के लिए एक अनुवाद परत प्रदान करता है। wiki.winehq.org/…
mattdm

1
खैर, मुझे लगा कि यह पूरी तरह से असंभव नहीं होगा, लेकिन मैंने यह भी उम्मीद नहीं की थी कि यह लगभग उतना ही सरल होगा जितना मैंने इसे वर्णित किया है। मैंने प्रश्न को सही होने के इरादे से लिखा था। यह कई बार ऐसा लगता है कि "मैक ओएस पर चलाने के लिए मैं एक लिनक्स बाइनरी को कैसे कन्वर्ट करूं" जैसे प्रत्यक्ष प्रश्न पूछने की तुलना में मामले के दिल में जाने का एक अधिक कुशल तरीका है। इसके अलावा, मैंने समय-समय पर वाइन का उपयोग किया है, लेकिन मैंने वास्तव में कभी नहीं सोचा था कि यह पहले कैसे काम करता था, मुझे लगता है कि मैं अब कुछ समय में इसे देखूंगा।
zec

17

यह उल्लेखनीय है यदि कोई ऐसा करने के लिए पर्याप्त समय बिताना चाहता है। डार्लिंग परियोजना इस प्रयास कर रहा है, हालांकि इस लेखन के रूप में, यह एक बहुत आदिम अवस्था में है।

इसे अन्य प्लेटफार्मों पर सफलतापूर्वक किया गया है:

  • Solaris और UnixWare में एक सहायक प्रोग्राम शामिल है, lxrunजो कुछ इस तरह से काम करता है जैसे sudo: आप अपने निष्पादन योग्य नाम और मापदंडों को सहायक के पास भेजते हैं और यह गतिशील रूप से चीजों को ठीक करता है ताकि निष्पादन योग्य OS से बात कर सके। आधिकारिक साइट (नीचे, संग्रह लिंक ) यह है कहते हैं bitrotted

  • लिनक्स के कर्नेल में एक बार iBCS नामक एक सुविधा थी, जो इसके विपरीत थी, सिवाय इसके कि उसे एक सहायक की आवश्यकता नहीं थी क्योंकि कर्नेल ने "विदेशी" बायनेरिज़ को सीधे मान्यता दी थी। कर्नेल 2.3 विकास श्रृंखला के दौरान यह गड़बड़ी में गिर गया , सबसे अधिक संभावना है क्योंकि छोटे यूनिक्स सर्वर की लड़ाई अनिवार्य रूप से 2.4 से बाहर आने के बाद खत्म हो गई थी।

  • फ्रीबीएसडी के कर्नेल को लिनक्स बायनेरिज़ को पहचानने और उन्हें चलाने के लिए कॉन्फ़िगर किया जा सकता है जैसे कि वे मूल निवासी थे। यह सुविधा उपर्युक्त दो की तुलना में बेहतर आकार में प्रतीत होती है।

    OpenBSD और NetBSD में समान विशेषताएं हैं।

OS X में बहुत सारे FreeBSD हैं , इसलिए इसके Linux समर्थन को पोर्ट करना सीधा हो सकता है।


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

@ Jörg W Mittag - भी, आपके पास उपलब्ध अन्य प्लेटफॉर्म से सिस्टम लाइब्रेरी की आवश्यकता है। यह शायद ऑटोजोन के खिलाफ उनके मुकदमे का आधार हो सकता है। लेकिन ईमानदारी से मैं विवरण भूल जाता हूं और मुश्किल से देखभाल करता हूं। :)
mattdm

तो आप जो कहते हैं वह अनिवार्य रूप से है, कि यदि ऑपरेटिंग सिस्टम X ऑपरेटिंग सिस्टम Y के समान सेवाएं प्रदान करता है, तो एक बाइनरी दोनों के तहत चल सकती है। यह सच है, लेकिन सिस्टम एक्स के लिए एक जानबूझकर प्रयास की आवश्यकता है। मैं ओएस एक्स के साथ इस तरह से संगत होने के लिए किसी भी ऑपरेटिंग सिस्टम से अनजान हूं।
Thorbjørn Ravn Andersen

bitrotten? मैं खुद को दिखाऊंगा।
GnP

3

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

शराब के विकास में बहुत मुश्किल यह है कि वे एक बंद स्रोत ऑपरेटिंग सिस्टम से एक द्विआधारी प्रारूप को पोर्ट कर रहे हैं और सिस्टम कॉल के MANY अनिर्दिष्ट हैं। उन्हें आवश्यक रूप से ऑपरेटिंग सिस्टम को रिवर्स इंजीनियर करना था।

अगर किसी को एक ओपन ओएस से दूसरे ओपन ओएस पर ऐसा करना था, तो वे संभवतः इसे 1/10 समय में प्राप्त कर सकते थे, क्योंकि संगतता परत काफी समान रूप से दूसरे ओएस से कॉपी / पेस्ट की जा सकती है यदि एक समतुल्य नेटिव सिस्टम कॉल मौजूद नहीं है। बेशक, पोसिक्स दुनिया भर में ज्यादातर मामलों में, एक देशी कॉल उपलब्ध होगा।

नोट की एक अन्य परियोजना रिएक्टोस है, जहां वे अनिवार्य रूप से विंडोज का पूर्ण बाइनरी-संगत संस्करण बना रहे हैं ... वाइन की कोई आवश्यकता नहीं है।


1

यह तकनीकी रूप से macOS में उल्लेखनीय है, लेकिन महत्वपूर्ण प्रयास के बिना नहीं, हालांकि कुछ प्रयास हमारे लिए पहले से ही किए गए हैं।

  • दोनों macOS और एक रीब्रांडेड Red Hat Enterprise Linux को UNIX 03 प्रमाणित किया गया है। सिद्धांत रूप में POSIX कॉल का यही API होना चाहिए।
  • MacOS और Linux दोनों amd64 प्लेटफॉर्म के लिए सिस्टम V ABI का उपयोग करते हैं। इसका मतलब है कि amd64 के लिए macOS और Linux में संगत ABI और API होना चाहिए।
  • macOS अपने मूल निष्पादन योग्य प्रारूप के रूप में Mach-O का उपयोग करता है जबकि लिनक्स ELF का उपयोग करता है। यह चीजों को आसान बनाता है, क्योंकि निष्पादन योग्य फ़ाइल प्रारूप का उपयोग यह भेद करने के लिए किया जा सकता है कि क्या संगतता परत को बुलाया जाना चाहिए। binfmt_miscहालांकि यह कुछ इस तरह की आवश्यकता होगी ।
  • थर्ड पार्टी macOS कर्नेल एक्सटेंशन मौजूद है जो वास्तव में प्रदान करता है। अब हमारे पास ईएलएफ को लोड करने के लिए कॉन्वेंट मैकओएस को लोड करने का एक तरीका है, हमें अपने विशेष की आवश्यकता है ld-linux.soजो खुद एक माच-ओ निष्पादन योग्य है जो हमारे ईएलएफ को लोड करेगा और इसे चलाएगा।

अब हमें जो चाहिए वह कम से कम एक विशेष है ld-linux.soजो निम्नलिखित कार्य कर सकता है:

  • मच-ओ निष्पादन योग्य या dyldस्वयं,
  • सही पते पर मेमोरी में लिनक्स ईएलएफ फाइलों को लोड कर सकते हैं,
  • उम्मीद है कि macOS वाले के लिए लिनक्स सोनम को मैप करने की क्षमता है (उदाहरण के /lib/libc.so.6लिए /lib/libSystem.B.dylib) और इसी मिलान को लोड करें जब मिलान ईएलएफ नहीं मिला, तो हम macOS पुस्तकालयों का पुन: उपयोग कर सकते हैं

ईएलएफ के ऊपर सिर्फ उस लोडर के साथ जो सीधा सिसकल्स नहीं बनाता है, काम करने का एक अच्छा मौका है, लेकिन हो सकता है कि ईएलएफ सिस्कॉल के साथ काम न करे। एक दूसरा घटक जो उपयोगी हो सकता है वह एक कर्नेल एक्सटेंशन होगा जो उन लिनक्स सिस्कोल्स को पकड़ता है और उन्हें macOS वालों को मैप करता है। डेस्कटॉप उपयोग के रूप में, लिनक्स ग्राफिक्स कॉल को मैप करने OpenGL.frameworkऔर करने के लिए विशेष मेसा कार्यान्वयन की आवश्यकता होती है Metal.framework


0

कई विशेष लिनक्स ऐप हैं जिनके लिए यह एक बड़ी मदद होगी। FPGA की तरफ, क्वार्टस और विवाडो ऐसे प्रोग्राम्स के अच्छे उदाहरण हैं जो लिनक्स के तहत चलते हैं और उनके लिए समान कोड उपलब्ध होने की संभावना नहीं है या इसी तरह के प्रोग्राम जो नवीनतम FPGAs को लक्षित करते हैं।

मुझे लगता है कि आपके प्रश्न का सरल उत्तर है: MacOS पर recompile जहां आपके पास स्रोत है और क्षमता प्रदान करने के लिए एक समूह बनाते हैं यदि आपके पास समय है - और यह एक समय लेने वाला कार्य होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.