मैं C # सीख रहा हूं, इसलिए मैंने थोड़ा C # प्रोग्राम बनाया जो कहता है Hello, World!
, फिर इसे संकलित किया mono-csc
और इसके साथ भाग लिया mono
:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
मैंने देखा है कि जब मैं हिट TAB
में bash
, Hello.exe
निष्पादन योग्य चिह्नित किया गया था। वास्तव में, यह फ़ाइल नाम लोड करने वाले शेल द्वारा चलता है!
Hello.exe
है न एक अजीब फ़ाइल एक्सटेंशन के साथ एक ELF फ़ाइल:
$ readelf -a Hello.exe
readelf: Error: Not an ELF file - it has the wrong magic bytes at the start
$ xxd Hello.exe | head -n1
00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000 MZ..............
MZ
इसका मतलब है कि यह एक Microsoft Windows स्टैटिकली एक्सेलेबल है। इसे एक विंडोज बॉक्स पर छोड़ें, और यह चलेगा (चाहिए)।
मैं है wine
स्थापित है, लेकिन wine
, विंडोज क्षुधा के लिए एक संगतता परत जा रहा है, के बारे में 5x को चलाने के लिए जब तक ले जाता है Hello.exe
के रूप में mono
है और इसे क्रियान्वित सीधे है, इसलिए यह नहीं है wine
कि यह चलता है।
मुझे लगता है कि वहाँ कुछ mono
कर्नेल मॉड्यूल स्थापित है mono
जो कि exec
syscall / s को स्वीकार करता है, या बायनेरिज़ के साथ शुरू होता है 4D 5A
, लेकिन lsmod | grep mono
दोस्त एक त्रुटि लौटाते हैं।
यहाँ क्या हो रहा है, और कर्नेल को कैसे पता है कि यह निष्पादन योग्य है?
बस प्रमाण के लिए यह मेरा शेल काम करने वाला जादू नहीं है, मैंने इसे चलाने के लिए क्रैप शैल (उर्फ sh
) का उपयोग किया और यह अभी भी मूल रूप से चलता है।
यहाँ पूरा कार्यक्रम है, क्योंकि एक टिप्पणीकार उत्सुक था:
using System;
class Hello {
/// <summary>
/// The main entry point for the application
/// </summary>
[STAThread]
public static void Main(string[] args) {
System.Console.Write("Hello, World!\n");
}
}
program codefile
, आपके मामले में कार्यक्रम मोनो है, जबकि मेरे उदाहरणों में php, python, perl और java शामिल हैं। मुझे संदेह है कि अगर मोनो अभी भी। Exe फ़ाइल को कोड के माध्यम से निष्पादित करने की अनुमति देता है। यह विंडोज़ पर बिल्कुल निर्भर नहीं होना चाहिए क्योंकि यह एक संकलित कोड को निष्पादित करता है। हालाँकि अगर आपकी स्रोत फ़ाइल में कुछ निर्भर कोड हैं जैसे कि विंडोज़ केवल एपीआई तो जाहिर है आपको उस exe फ़ाइल को चलाने के लिए शराब की आवश्यकता होगी।
/etc/magic
या /usr/share/file/magic
(या इसी तरह जादुई स्थान) फ़ाइल के लिए आवश्यक जानकारी यह करने के लिए सक्षम होने के लिए होता है।
$ foo.jar
बजाय कर सकें $ java -jar foo.jar
- मोनो के लिए जैसा किया जाता है।
php hello.php
याpython hello.py
या जैसी आज्ञाएँ चलाते हैं, तो वे भी चलेंगी क्योंकि उनकी कोई निष्पादन योग्य नहीं है, लेकिन एक प्रोग्राम फ़ाइल को पढ़ता है और निष्पादित करता है। हालाँकि, यदि आप इसके बजाय दौड़ते हैं तो मैंने आपका प्रश्न पाया और उत्तर को और अधिक उचित माना (जो कि निश्चित रूप से द्विधा-समर्थन का उपयोग करता है।perl hello.pl
java hello
./hello.exe
mono hello.exe