ELF फ़ाइलों और बिन फ़ाइलों के बीच अंतर क्या है?


99

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


यह कहना है NASM का । एआरएम विशिष्ट नहीं है, लेकिन एक ही अवधारणा होने की संभावना है। उदाहरण के लिए, यदि आप किसी फ़ाइल को केवल NOPबिना -f(या -fbin) के संकलित करते हैं, तो वह 0x90400 बाइट के साथ एक एकल बाइट के साथ संकलित करता है, जिसके साथ ELF कंटेनर है -felf32। तो सिर्फ कच्चा कोड, कोई कंटेनर मेटाडेटा नहीं। NASM का कहना है कि इसका उपयोग ज्यादातर MS-DOS .COM और .SYS फाइलों के लिए किया जाता है। sectionनिर्देशों को ज्यादातर अनदेखा किया जाता है और केवल संरेखण उत्पन्न होता है।
सिरो सेंटिल्ली 郝海东 冠状 i i

यह एक तरीका है जिसमें बिन फाइलें उपयोगी हो सकती हैं: ऑपरेटिंग सिस्टम को तैनात करने के लिए बूट सेक्टर बनाने के लिए: stackoverflow.com/a/32483545/895245
Ciro Santilli 郝海东 which which which 法轮功 法轮功 法轮功

जवाबों:


94

बिन फ़ाइल एक शुद्ध बाइनरी फ़ाइल है जिसमें कोई मेमोरी फिक्स-अप या रिलोकेशन नहीं होता है, अधिक से अधिक यह विशिष्ट मेमोरी पते पर लोड होने के स्पष्ट निर्देश हैं। जहाँ तक....

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


"संभावना से अधिक यह एक विशिष्ट मेमोरी पते पर लोड करने के लिए स्पष्ट निर्देश हैं": इसका मतलब यह है कि बिन फ़ाइल पीढ़ी की प्रक्रिया डेटा को विशिष्ट पते पर लोड करने के लिए अतिरिक्त कोड जोड़ती है?
पेंघे गेंग

1
जहाँ तक मैंने सीखा है कि बिन फ़ाइल ऑफ़सेट 0 से प्रोग्राम को चलाने की तरह है और डेटा सेगमेंट भीतर एम्बेडेड है। अगर यह गलत है तो कृपया मुझे सुधारें।
मार्टिन केर्स्टन

@MartinKersten सही, बिन फाइलें ऑफसेट 0 से शुरू होती हैं
t0mm13b

1
@ t0mm13b तो .elf फ़ाइलों को एक नियमित .hex फ़ाइल की तरह एक माइक्रो-नियंत्रक पर जलाया जा सकता है, लेकिन इसमें अधिक फ्लैश मेमोरी होती है, और हर बार माइक्रो रीसेट होने पर, अनुभाग पते बदल जाते हैं?
ऐलगावाड

@ ब्लेकडकी, मुझे विश्वास नहीं है कि यह संभव है। यदि एक माइक्रोकंट्रोलर ने सीधे ईएलएफ डेटा को निष्पादित करने की कोशिश की तो यह हेडर और अन्य डेटा को निर्देश के रूप में गलत बताएगा, है ना?
जकॉब

40

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

एक योगिनी फ़ाइल में बिन जानकारी होती है, लेकिन यह बहुत सारी अन्य जानकारी, संभावित डिबग जानकारी, प्रतीकों से घिरा होता है, बाइनरी के भीतर डेटा से कोड को अलग कर सकता है। एक से अधिक बाइनरी डेटा के लिए अनुमति देता है (जब आप इनमें से किसी एक को डंप करते हैं तो आपको एक बड़ी बिन फ़ाइल मिलती है जो डेटा को अगले ब्लॉक पर पैड करने के लिए भरती है)। आपको बताता है कि आपके पास कितना बाइनरी है और कितना bss डेटा है जो कि zeros से आरंभ किया जाना चाहता है (gnu टूल्स में बिन फाइलों को सही तरीके से बनाने में समस्याएं हैं)।

योगिनी फ़ाइल प्रारूप एक मानक है, हाथ मानक पर अपने संवर्द्धन / बदलाव प्रकाशित करता है। मेरा सुझाव है कि हर कोई समझने के लिए एक योग्‍य कार्यक्रम लिखता है कि वहां क्या है, एक पुस्तकालय के साथ परेशान न करें, यह सिर्फ जानकारी और संरचनाओं का उपयोग करने के लिए काफी सरल है। सामान्य रूप से बनाने वाली .bin फ़ाइलों के साथ-साथ लिंकर स्क्रिप्ट और अन्य चीजें जो आपके बिन या योगिनी आउटपुट को गड़बड़ाने में मदद कर सकती हैं, में ग्नू की समस्याओं को दूर करने में मदद करता है।


1
0x7C00 एक बूटलोडर की तरह लगता है जो जरूरी नहीं है कि एल्फ का उपयोग करें। यह एक सामान्य प्रश्न है। एक ऑपरेटिंग सिस्टम में वर्चुअल (वर्चुअल) एड्रेस स्पेस के लिए नियम होंगे, टूलचिन को उस ऑपरेटिंग सिस्टम के नियमों पर लक्षित करने की आवश्यकता होगी, फिर फ़ाइल फॉर्मेट, पते के साथ लोड करने योग्य आइटम और एक एंट्री पॉइंट लोड होने के बाद, प्लस अन्य चीजों को इंगित करेगा। योगिनी सिर्फ एक कंटेनर है, एक बॉक्स की तरह, आपको इसे लक्षित उपयोग के मामले में सही पैक करना होगा।
old_timer

1
यदि आप वीजीए के लिए कुछ एएससीआई प्रिंट करना चाहते हैं, तो आप ऐसा करने के लिए एक प्रोग्राम लिखते हैं जिसमें कुछ डेटा है या गणितीय रूप से फ्लाई या कुछ संयोजन पर डेटा उत्पन्न करता है, फिर आप उस प्रोग्राम को ऑपरेटिंग सिस्टम परिभाषित कोड स्पेस में लोड करते हैं, और फिर चलाते हैं। यह। आप आमतौर पर डेटा को एक भौतिक परिधीय, और इसके दुर्लभ ऑपरेटिंग सिस्टम में सही रूप से नहीं हिलाते हैं जो आपको वैसे भी ऐसा करने देगा या इसके लोडर को ऐसा करने की अनुमति देगा।
old_timer

1
नंगे धातु के लिए, esp अगर यह योगिनी फ़ाइल बूटलोडर और / या पहला प्रोग्राम रन है, तो प्रवेश बिंदु और _start प्रासंगिक नहीं हैं क्योंकि आप योगिनी के लिए एक स्टेपिंग पत्थर के रूप में या तो एक टूल का उपयोग करते हैं जो फ्लैश को प्रोग्राम करता है (जैसे ओपेनड ओवर jtag) या जो कुछ भी-ओब्जेकॉपी-ओ बाइनरी file.elf file.bin के माध्यम से और फिर उस फाइल को किसी तरह फ्लैश में लोड किया जाता है। नहीं गए और x86 पर एक बूटलोडर की कोशिश की, लेकिन यह मान लें कि बायोस कैंट पार्स एल्फ फाइलें नहीं है, इसलिए इसे एक मेमोरी इमेज के रूप में भी आवश्यक होगा। तो एक-द्विआधारी प्रकार बिन फ़ाइल
old_timer

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

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

30

कुछ संसाधन:

  1. एआरएम वास्तुकला के लिए ईएलएफ
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. विकि से ELF
    http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

आमतौर पर ईएलएफ प्रारूप संकलन का डिफ़ॉल्ट आउटपुट है। यदि आप GNU टूल चेन का उपयोग करते हैं, तो आप इसे objcopy का उपयोग करके द्विआधारी प्रारूप में अनुवाद कर सकते हैं, जैसे:

  arm-elf-objcopy -O binary [elf-input-file] [binary-output-file]

या fromELF उपयोगिता का उपयोग करके (हालांकि ADS जैसे अधिकांश IDE में निर्मित):

 fromelf -bin -o [binary-output-file] [elf-input-file]

6
बिन फ़ाइल विस्तार का उत्तर दिए जाने के बाद यह जोड़ा गया था, और व्यावहारिक रूप से उपयोगी तकनीक को जोड़ता है। उसके लिए +1।
इरबडेक्स

-1

मैं यहां एक बिंदु को ठीक करना चाहता हूं। ELF फ़ाइल लिंकर द्वारा निर्मित होती है, संकलक द्वारा नहीं।

कम्पाइलर मिशन ऑब्जेक्ट फ़ाइलों (* .o) को स्रोत कोड फ़ाइलों से बाहर करने के बाद समाप्त होता है। लिंकर सभी .o फाइलों को एक साथ जोड़ता है और ईएलएफ का उत्पादन करता है।


डाउनवोट किया गया क्योंकि यह प्रश्न का उत्तर नहीं दे रहा है और न ही सही है। मोटे तौर पर परिभाषित, संकलन में लिंकिंग शामिल है। ldप्रलेखन से उद्धृत : आमतौर पर किसी प्रोग्राम को तैयार करने का अंतिम चरण ld चलाना होता है।
बेज़मैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.