C में कोई ऑब्जेक्ट फ़ाइल क्या है?


140

मैं C में पुस्तकालयों के बारे में पढ़ रहा हूं लेकिन मुझे अभी तक इस बारे में कोई स्पष्टीकरण नहीं मिला है कि वस्तु फ़ाइल क्या है। किसी अन्य संकलित फ़ाइल और ऑब्जेक्ट फ़ाइल के बीच वास्तविक अंतर क्या है?
मुझे खुशी होगी अगर कोई मानव भाषा में समझा सकता है।


इसका एक अधिक सक्रिय संस्करण: stackoverflow.com/questions/12122446/…
Ciro Santilli 病 病 六四 this 事件

जवाबों:


153

एक ऑब्जेक्ट फ़ाइल संकलन चरण से वास्तविक आउटपुट है। यह ज्यादातर मशीन कोड है, लेकिन जानकारी है कि एक लिंकर को यह देखने की अनुमति देता है कि इसमें क्या प्रतीक हैं और साथ ही प्रतीकों को काम करने के लिए इसकी आवश्यकता है। (संदर्भ के लिए, "प्रतीक" मूल रूप से वैश्विक वस्तुओं, कार्यों आदि के नाम हैं)

एक लिंकर इन सभी ऑब्जेक्ट फ़ाइलों को लेता है और उन्हें एक निष्पादन योग्य बनाने के लिए संयोजित करता है (यह मानते हुए कि यह कर सकता है, यानी: कोई डुप्लिकेट या अपरिभाषित प्रतीक नहीं हैं)। बहुत सारे कंपाइलर आपके लिए ऐसा करेंगे (पढ़ें: वे लिंकर को अपने दम पर चलाते हैं) यदि आप उन्हें कमांड लाइन विकल्पों का उपयोग करके "बस संकलन" करने के लिए नहीं कहते हैं। ( -cएक आम "बस संकलन है; लिंक नहीं" विकल्प।)


दरअसल, अधिकांश संकलक के साथ, संकलन चरण से आउटपुट असेंबली कोड है, और संकलक तब कोडांतरक को एक ऑब्जेक्ट फ़ाइल में बदलने के लिए आमंत्रित करता है।
क्रिस डोड

15
@ क्रिसडोड: अक्सर पुराने संकलक के साथ ऐसा ही था। इन दिनों, एक कंपाइलर असेंबली कोड उत्पन्न नहीं करेगा, जब तक कि आप इसे नहीं पूछेंगे, और अक्सर आंतरिक रूप से इसका उपयोग नहीं करते हैं। लेकिन किसी भी तरह से, विधानसभा संकलन चरण का एक उप-चरण होगा, इसलिए यह सब मूट है।
cHao

2
क्या कोई एकल फ़ाइल निष्पादन योग्य हो सकती है?
हनी

1
@ हनी: आम तौर पर, नहीं। भले ही ऑब्जेक्ट फ़ाइल निष्पादन के लिए डिज़ाइन किए गए प्रारूप में थी (जो मूल रूप से कभी नहीं होती है), उस हिस्से के बारे में "प्रतीकों के लिए इसे काम करने के लिए आवश्यक है" मूल रूप से सौदे को मारता है। यहां तक ​​कि आपके मानक "हैलो वर्ल्ड" में सी रनटाइम लाइब्रेरी के खिलाफ लिंकिंग की आवश्यकता होती है।
cHao

74
  1. ऑब्जेक्ट फ़ाइल स्वयं संकलित फ़ाइल है। दोनों में कोई अंतर नहीं है।

  2. ऑब्जेक्ट फ़ाइलों को लिंक करके एक निष्पादन योग्य फ़ाइल बनाई जाती है।

  3. ऑब्जेक्ट फ़ाइल में निम्न स्तर के निर्देश होते हैं जिन्हें CPU द्वारा समझा जा सकता है। इसीलिए इसे मशीन कोड भी कहा जाता है।

  4. यह निम्न स्तरीय मशीन कोड निर्देशों का द्विआधारी प्रतिनिधित्व है जिसे आप असेंबली भाषा का उपयोग करके सीधे लिख सकते हैं और फिर असेंबली का उपयोग करके विधानसभा भाषा कोड (अंग्रेजी में प्रतिनिधित्व) को मशीन भाषा (हेक्स में प्रतिनिधित्व) में संसाधित कर सकते हैं।

उच्च स्तरीय भाषा जैसे सी में कोड के लिए इस प्रक्रिया के लिए एक सामान्य उच्च स्तरीय प्रवाह है

-> प्री-प्रोसेसर के माध्यम से जाता है

-> अनुकूलित कोड देने के लिए, अभी भी सी में

-> संकलक के माध्यम से जाता है

-> असेंबली कोड देने के लिए

-> एक कोडांतरक के माध्यम से जाता है

-> मशीन भाषा में कोड देने के लिए जो OBJECT FILES में संग्रहित है

-> लिंकर के माध्यम से जाता है

-> एक निष्पादन योग्य फ़ाइल प्राप्त करने के लिए।

इस प्रवाह में कुछ बदलाव हो सकते हैं उदाहरण के लिए अधिकांश कंपाइलर मशीन भाषा कोड को सीधे इकट्ठा कर सकते हैं, एक कोडांतरक के बिना। इसी तरह, वे आपके लिए पूर्व-प्रसंस्करण कर सकते हैं। फिर भी, बेहतर समझ के लिए घटकों को तोड़ना अच्छा है।


5
पूर्व-प्रोसेसर चरण में अनुकूलित कोड उत्पन्न नहीं हो रहा है और न ही इसके तुरंत बाद। प्री-प्रोसेसर केवल अपनी भाषा से संबंधित है और यही वह है। अनुकूलन संकलन और विधानसभा चरणों में होता है।
इग्नास 2526

क्या वस्तु फ़ाइल हमें मशीन भाषा में निष्पादन योग्य फ़ाइल के संकलन के बाद मिलती है। मैं उलझन में हूँ क्योंकि, आपने कहा था कि ऑब्जेक्ट फ़ाइल अंतिम से दूसरे चरण पर बनाई गई है और अंतिम चरण निष्पादन योग्य फ़ाइल है। तो, संकलन के बाद हमें मिलने वाली .0 फ़ाइल, निष्पादन योग्य फ़ाइल है?
AV94

एक भी वस्तु फ़ाइल निष्पादन योग्य नहीं हो सकती है?
हनी

33

ऑब्जेक्ट फ़ाइल के 3 प्रकार हैं।

स्थानांतरित करने योग्य ऑब्जेक्ट फ़ाइलें

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

यदि आपके पास a.cस्रोत फ़ाइल है, तो जीसीसी के साथ उसकी ऑब्जेक्ट फ़ाइल बनाने के लिए आपको चलना चाहिए: gcc a.c -c

पूरी प्रक्रिया होगी: प्रीप्रोसेसर (सीपीपी) एसी पर चलेगा इसका आउटपुट (स्टिल सोर्स) कंपाइलर (cc1) में फीड होगा। इसका आउटपुट (असेंबली) असेंबलर (अस) में फीड होगा, जो प्रोड्यूस करेगा relocatable object file। उस फ़ाइल में ऑब्जेक्ट कोड और लिंकिंग (और डिबगिंग अगर -gइस्तेमाल किया गया था) मेटाडेटा शामिल है, और सीधे निष्पादन योग्य नहीं है।

साझा की गई फ़ाइलें

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

निष्पादन योग्य ऑब्जेक्ट फ़ाइलें

कंटेनर मशीन कोड जिसे सीधे मेमोरी में लोड किया जा सकता है (लोडर द्वारा, उदाहरण के लिए निष्पादित ) और बाद में निष्पादित किया जाता है।

कई पर लिंकर चलाने का परिणाम relocatable object filesहै a executable object file। लिंकर सभी इनपुट ऑब्जेक्ट फाइलों को कमांड लाइन से, बाएं से दाएं, सभी एक ही प्रकार के इनपुट सेक्शन (जैसे .data) को एक ही प्रकार के आउटपुट सेक्शन में मर्ज कर देता है । यह उपयोग करता है symbol resolutionऔर relocation

बोनस पढ़ा:

जब static libraryइनपुट ऑब्जेक्ट्स में संदर्भित फ़ंक्शंस के खिलाफ लिंक को अंतिम निष्पादन योग्य में कॉपी किया जाता है। इसके dynamic librariesबजाय एक प्रतीक तालिका बनाई गई है जो लाइब्रेरी के कार्यों / ग्लोबल्स के साथ एक गतिशील लिंकिंग को सक्षम करेगी। इस प्रकार, परिणाम एक आंशिक रूप से निष्पादन योग्य वस्तु फ़ाइल है, क्योंकि यह पुस्तकालय पर निर्भर करता है। यदि लाइब्रेरी मौजूद नहीं है, तो फ़ाइल अब निष्पादित नहीं हो सकती है)।

लिंकिंग प्रक्रिया निम्नानुसार की जा सकती है: ld a.o -o myexecutable

आदेश: gcc a.c -o myexecutableबिंदु 1 और बिंदु 3 पर वर्णित सभी आदेशों को लागू करेगा (cpp -> cc1 -> as -> l1 1 )

1: वास्तव में collect2 है, जो ld पर एक आवरण है।


11

एक ऑब्जेक्ट फ़ाइल बस वही होती है जो आपको तब मिलती है जब आप एक (या कई) स्रोत फ़ाइल संकलित करते हैं।

यह या तो पूरी तरह से निष्पादित निष्पादन योग्य या पुस्तकालय, या मध्यवर्ती फाइलें हो सकती है।

ऑब्जेक्ट फ़ाइलों में आम तौर पर मूल कोड, लिंकर जानकारी, डिबगिंग प्रतीक और आगे होते हैं।


2

ऑब्जेक्ट फाइलें कोड हैं जो प्रोग्राम को चलाने के लिए फ़ंक्शंस, प्रतीकों और टेक्स्ट पर निर्भर हैं। पुरानी टेलेक्स मशीनों की तरह, जिन्हें अन्य टेलीक्स मशीन को सिग्नल भेजने के लिए टेलेटिपिंग की आवश्यकता होती है।

उसी तरह प्रोसेसर को चलाने के लिए बाइनरी कोड की आवश्यकता होती है, ऑब्जेक्ट फाइलें बाइनरी कोड की तरह होती हैं लेकिन लिंक नहीं होती हैं। लिंक करने से अतिरिक्त फाइलें बनती हैं ताकि उपयोगकर्ता को सी भाषा स्वयं संकलित न करनी पड़े। एक बार ऑब्जेक्ट फ़ाइल को कुछ संकलक जैसे c भाषा, या vb आदि से लिंक करने के बाद, उपयोगकर्ता exe फ़ाइल को सीधे खोल सकते हैं।

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