私は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が静的にリンクされた実行可能ファイルであることを意味します。Windowsのボックスにドロップすると、実行されます(実行されるはずです)。
私がしているwine
インストールされていますが、wine
Windowsアプリケーションの互換性層である、約5倍限り実行にかかるHello.exe
としてmono
、それを直接実行するか、そうではないwine
ことは、それを実行します。
syscall / s をインターセプトする、またはで始まるバイナリをキャッチするmono
カーネルモジュールがインストールされてmono
いるが、友人がエラーを返すと仮定しています。exec
4D 5A
lsmod | grep mono
ここで何が起こっているのでしょうか?また、カーネルはこの実行可能ファイルが特別であることをどのように知っていますか?
証明のために、それは私のシェルの魔法ではないので、私はそれを実行するためにCrap Shell(別名sh
)を使用しましたが、それはネイティブに実行されます。
コメンターが好奇心was盛だったので、ここに完全なプログラムがあります:
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ファイル以外の拡張子を許可するかどうかは疑わしい。最終的にこれはコンパイルされたコードを実行するため、ウィンドウにまったく依存するべきではありません。ただし、ソースファイルにWindows専用APIなどの依存コードが含まれている場合は、そのexeファイルを実行するために明らかにwineが必要です。
$ foo.jar
むしろ可能です$ java -jar foo.jar
-モノの場合と同様です。
php hello.php
またはpython hello.py
またはperl hello.pl
Javaのようなコンパイル言語の場合、またはjava hello
、彼らはまた、そこには、実行が、読み出されたプログラムが自分でないように実行し、ファイルを実行しますが。しかし、./hello.exe
代わりに実行した場合mono hello.exe
、私はあなたの質問を見つけて、より合理的な回答を受け入れました(この場合は間違いなくbinfmt-supportを使用します。