क्या (C) विभिन्न कंपाइलरों के साथ बनाई गई ऑब्जेक्ट फाइलें बाइनरी-कम्पेटिबल हैं?


11

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

क्या मैं यह सोचकर सही हूं कि इस बात की कोई गारंटी नहीं है कि विभिन्न कंपाइलरों के साथ संकलित दो ऑब्जेक्ट फाइलें वास्तव में ठीक से लिंक होंगी? उदाहरण के लिए, पॉइंटर्स का आकार एक ऑब्जेक्ट फ़ाइल में 32 बिट्स और दूसरे में 64 बिट्स हो सकता है। लेकिन अगर ऐसा है, तो C पुस्तकालयों को कभी-कभी पहले से तैयार फॉर्म में क्यों वितरित किया जाता है? क्या कोई उम्मीद है कि मैं उसी कंपाइलर का उपयोग करूँगा जो उन्होंने किया था (उदाहरण के लिए gcc), या द्विआधारी अनुकूलता सुनिश्चित करने के लिए कुछ वास्तविक मानक का उपयोग किया जा रहा है? और विदेशी भाषा इंटरफ़ेस वाली अन्य भाषाएं कैसे सुनिश्चित करती हैं कि सी ऑब्जेक्ट फ़ाइलों के साथ लिंक करते समय चीजें ठीक से लाइन में आएंगी?


जहाँ तक मुझे याद है, C ऑब्जेक्ट फ़ाइलों को एक-दूसरे के साथ तब तक संगत होना चाहिए जब तक वे एक ही प्लेटफ़ॉर्म के लिए संकलित न हो जाएं। एक ऑब्जेक्ट फ़ाइल एक संग्रह है जिसमें कुछ प्रतीक तालिका के साथ लोड करने योग्य बाइनरी कोड होता है जिसका उपयोग मॉड्यूल के अंदर प्रत्येक प्रतीक तक पहुंचने के लिए किया जा सकता है।
जियोर्जियो

2
libs को संगत बनाया जा सकता है, मुझे नहीं लगता कि obj की गारंटी है
शाफ़्ट फ्रीक

@Giorgo "एक ही मंच" से, क्या आप CPU आर्किटेक्चर या CPU आर्किटेक्चर + OS से मतलब रखते हैं?
डोभाल

@ratchetfreak मैं इस धारणा के तहत था कि एक लिबास कई ऑब्जेक्ट फ़ाइलों के अधिकांश भाग के लिए एक लिबास है। क्या वह गलत है?
डोभाल

मुझे उम्मीद नहीं होगी कि ऑब्जेक्ट्स अलग-अलग कंपाइलरों में संगत होंगे।
Old_timer

जवाबों:


10

सामान्य उत्तर नहीं है, सी भाषा संकलक एक दूसरे के साथ संगत नहीं हैं। सी भाषा मानक किसी भी प्रकार के द्विआधारी अंतर को परिभाषित नहीं करता है, और अधिकांश संकलक लेखक भी कोशिश नहीं करते हैं।

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

संगतता की कमी भी एक ही संकलक के विभिन्न संस्करणों तक फैली हुई है। सामान्य तौर पर, एक संकलक के पुराने और नए संस्करणों के साथ संकलित कार्यक्रमों और पुस्तकालयों को एक साथ जोड़ा नहीं जा सकता है, और MSVC के साथ संकलित उन लोगों को GCC द्वारा संकलित किए जाने के साथ जोड़ा नहीं जा सकता है।

एक विशिष्ट और बहुत उपयोगी अपवाद है। हर मंच ABI (एप्लीकेशन बाइनरी इंटरफेस) और किसी भी भाषा में किसी भी प्रोग्राम को एक गतिशील लिंक प्रदान करता है जो ABI के अनुरूप हो। इसलिए आमतौर पर MSVC (या कुछ और) के साथ DLL (विंडोज पर) का निर्माण करना संभव है और इसे MSVC के एक अलग संस्करण या GCC और इसके विपरीत द्वारा संकलित प्रोग्राम से कॉल किया जा सकता है।

विंडोज पर दो अन्य ABI हैं: COM और .NET असेंबली, और वे भाषाओं की एक विस्तृत श्रृंखला का विस्तार करते हैं। इसलिए अंतर-सम्भावना निश्चित रूप से संभव है, लेकिन संगत वे नहीं हैं।


लिंकर नक्शे की तुलना करके असंगति की डिग्री को आसानी से देखा जा सकता है। जीएनयू उपयोग के लिए ld -M, एमएसवीसी उपयोग के लिएlink /map । दो उत्पन्न फ़ाइलों का अध्ययन करें। दोनों में उनके नाम होंगे जिन्हें आप पहचानते हैं, जैसे कि प्रिंटफ और मुख्य, हालांकि (विकल्पों पर निर्भर करता है) नामों को विभिन्न तरीकों से मंगवाए जाने की संभावना है। उनके नाम भी होंगे जो पूरी तरह से अलग हैं, जिनमें से कई आप पहचान नहीं पाएंगे। संगत करने के लिए अलग-अलग संकलक द्वारा उत्पादित ऑब्जेक्ट फ़ाइलों के लिए उन सभी नामों पर सहमत होना होगा, और वे कभी नहीं करते हैं। एक ही संकलक के विभिन्न संस्करण भी हमेशा ऐसा नहीं कर सकते हैं।


यह उत्तर बार्ट के विरोधाभास लगता है ; ऐसा लगता है कि केवल साझा लाइब्रेरी संगत हैं। क्या आप बता सकते हैं कि C रनटाइम लाइब्रेरी के गैर-दृश्यमान, कार्यान्वयन-विशिष्ट कार्य इंटरऑपरेबिलिटी को क्यों रोकते हैं? आप यह भी कहते हैं कि "सी कंपाइलर द्वारा उत्सर्जित वस्तुओं को रनवे लाइब्रेरी के साथ जोड़ा जाना चाहिए ताकि या तो एक्जीक्यूटेबल या रनटाइम लिंकेबल लाइब्रेरी का निर्माण किया जा सके" - स्टैटिक लाइब्रेरीज़ के बारे में क्या?
डोभाल

जैसा कि बार्ट ने कहा, केवल एबीआई वाले पुस्तकालय ही संगत होते हैं। साझा पुस्तकालय (यूनिक्स पर) एक तरह के एबीआई हैं, अन्य हैं। HelloWorld.c लिखें, इसे MSVC के साथ संकलित करें और gcc, मानचित्रों की तुलना करें और आप देखेंगे कि वे कितने अलग हैं। 'रनटाइम लाइब्रेरियों' का अर्थ है कि प्रत्येक C / C ++ संकलन में स्वचालित रूप से संदर्भित आवश्यक समर्थन फ़ंक्शन, जो कि सांख्यिकीय या गतिशील रूप से जुड़े हो सकते हैं। उन्हें देखने के लिए मानचित्र या CRT स्रोत कोड पढ़ें।
david.pfx

मैं क्या की तुलना नक्शे का मतलब है तो मैं एक छोटे से अधिक विशिष्ट सा हो जाएगा पता नहीं है: यह मान के लिए सुरक्षित है व्यवहार में है कि किसी भी CPU वास्तुकला और OS संयोजन के लिए सभी compilers संगत कर रहे हैं? जैसे मेरे पास main.c है, जिसे मैं gcc और mylibrary.c के साथ संकलित करता हूं, जिसे मैं clang के साथ संकलित करता हूं, दोनों लिनक्स x64 को लक्षित करते हैं। यथोचित मुख्यधारा के ओएस (लिनक्स, मैक, विंडोज) को मानते हुए, क्या यह मान लेना सुरक्षित है कि दोनों कंपाइलर क्या हैं, इसकी परवाह किए बिना काम करेंगे?
डोभाल

1
अत्यधिक संभावना नहीं है, क्लैंग लिंक मानचित्र की जांच करें। संपादित देखें।
david.pfx

17

जिसे आप एबीआई (एप्लीकेशन बाइनरी इंटरफ़ेस) कहते हैं, उसके लिए आप क्या देख रहे हैं।

C भाषा ABI को परिभाषित नहीं करती है, इसलिए इस अर्थ में वास्तव में कोई गारंटी नहीं है कि विभिन्न संकलक के साथ संकलित C फाइलें एक दूसरे के साथ काम करेंगी।

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


यह समझ आता है। मैं इसे साझा पुस्तकालयों को ओएस के एबीआई का भी पालन करता हूं?
डोभाल

3
@ डोभाल ने विशेष रूप से साझा पुस्तकालय, उन्हें बाहरी दुनिया द्वारा कॉल करने योग्य बनाने की आवश्यकता है।
toasted_flakes
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.