2014-04-25 8 views
6

मैं जानना चाहता हूं कि लिनक्स ऑपरेटिंग सिस्टम फ़ाइलों को कैसे निष्पादित करता है। तो वेब पर मेरी खोजों से मुझे समझ में आया कि प्रत्येक फ़ाइल जिसमें चलने योग्य बिट सेट है, को निष्पादित किया जा सकता है। लेकिन फिर मैंने सीखा कि एक ईएलएफ प्रारूप कहा जाता है जो निष्पादन योग्य के लिए लिनक्स मानक है।लिनक्स फ़ाइल को कैसे निष्पादित करता है?

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

+0

मुझे याद है कहीं ऑनलाइन खोजना लेख है जिसमें किसी ने सबसे छोटे वैध निष्पादन योग्य एल्फ को हैंडकाफ्ट करने के लिए तैयार किया - आखिरकार उन्होंने कुछ डेटा संरचनाओं को ओवरलैप करना समाप्त कर दिया, लेकिन डब्ल्यू के साथ ए ने प्रत्येक की न्यूनतम भूमिका की व्याख्या की। मुझे यकीन नहीं है कि http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html यह था, या यदि यह एक और समान था। –

+0

@ क्रिससट्रैटन, http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html या http://timelessname.com/elfbin/। और क्या? यह सिर्फ छोटा ईएलएफ बाइनरी है, जिसे 'binfmt_elf' द्वारा लोड किया गया है। – osgx

उत्तर

10

Or does linux requires some kind of standard format, like ELF format or bash format?

हाँ, linux कुछ समर्थित (पंजीकृत) स्वरूप में हो सकता है और इसे निष्पादित करने के लिए में बिट सेट निष्पादित करने के लिए फ़ाइल की आवश्यकता है। लिनक्स में अधिकांश फ़ाइलों में ELF format, या "shebang" format (उनमें से दो पहले प्रतीक #! हैं और फिर दुभाषिया के पथ को लिखा गया है, जिसे बैश, पर्ल, पायथन और अन्य स्क्रिप्ट द्वारा उपयोग किया जाता है)। कभी-कभी पाठ फ़ाइलों को शेल स्क्रिप्ट के रूप में निष्पादित करने की अनुमति है, उदा। जब आप ./script को बैश से करते हैं (कर्नेल द्वारा नियंत्रित नहीं है, लेकिन बैश खोल द्वारा)।

do_execve फ़ंक्शन से शुरू होने वाले लिनक्स कर्नेल से fs/exec.c file में अधिक जानकारी उपलब्ध है।

कर्नेल उपप्रणाली "binfmt" अन्य निष्पादन योग्य प्रारूपों को पंजीकृत करने के लिए है। उदाहरण के लिए, binfmt_misc आपको /proc/sys/fs/binfmt_misc विशेष फ़ाइल के माध्यम से अपने बाइनरी प्रारूप को परिभाषित और पंजीकृत करने की अनुमति देता है। निष्पादन उपयोगकर्ता द्वारा परिभाषित "दुभाषिया" के माध्यम से संभाला जाता है, वह प्रोग्राम जो लक्ष्य निष्पादन योग्य को पढ़, लोड और निष्पादित कर सकता है। उदाहरण के लिए, विंडोज पीई बाइनरी wine गैर-एमुलेटर की मदद से शुरू की जा सकती है।

हम कर्नेल स्रोतों के fs directory में कई अंतर्निहित binfmt मॉड्यूल देख सकते हैं। सबसे आम हैं: binfmt_elf.c (ईएलएफ बाइनरी प्रारूप) और binfmt_script.c (जो "शेबांग" का पता लगाता है और दुभाषिया शुरू करता है)। एटी & टी से binary format "a.out" सरल है, जिसे binfmt_aout.c द्वारा संभाला जाता है, जो ईएलएफ से उत्पन्न करना आसान हो सकता है।

binfmt_aout.c 11374 bytes 
binfmt_elf.c 58415 bytes 
binfmt_elf_fdpic.c 48256 bytes 
binfmt_em86.c 2710 bytes 
binfmt_flat.c 27054 bytes 
binfmt_misc.c 15175 bytes 
binfmt_script.c 2768 bytes 
binfmt_som.c 7315 bytes 

फ़ाइल आप पर अमल करने की कोशिश प्रारूप समर्थित नहीं की जाती है, तो exec* syscalls त्रुटि लौटाएगा:

$ hexdump -C asd 
00000000 07 01 09 00 11 12 13 14 0a      |.........| 
00000009 
$ strace ./asd 
execve("./asd", ["./asd"], [/* 179 vars */]) = -1 ENOEXEC (Exec format error) 
.... 

अनुसार execve man page करने, वापसी कोड का अर्थ है:

ENOEXEC

An executable is not in a recognized format, is for the wrong architecture, or has some other format error that means it cannot be executed.

+0

उपयोगी लिंक: http://www.linux.it/~rubini/docs/binfmt/binfmt.html – osgx

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