我正在学习C#,所以我制作了一个小C#程序,说Hello, World!
,然后使用进行编译mono-csc
并运行mono
:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
我注意到,当我点击TAB
时bash
,Hello.exe
被标记为可执行。确实,它只是通过加载文件名的shell运行!
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
运行它。
我假设mono
安装了一些内核模块,mono
该模块可以拦截exec
syscall / s或捕获以开头的二进制文件4D 5A
,但是lsmod | grep mono
朋友返回错误。
这是怎么回事,内核如何知道此可执行文件很特殊?
只是为了证明这不是我的 shell魔术,我使用了Crap Shell(aka 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
,在您的情况下,程序为mono,而我的示例包括php,python,perl和java。我怀疑单声道是否允许通过.exe文件扩展到.exe文件以外的文件。它不应完全依赖于Windows,因为这最终是执行已编译的代码。但是,如果源文件具有某些依赖代码,例如仅Windows API,那么显然您必须需要wine才能运行该exe文件。
$ foo.jar
而不是$ java -jar foo.jar
-与mono相似。
php hello.php
or或python hello.py
orperl hello.pl
或在Java之类的编译语言的情况下,java hello
它们也将运行,因为它们在那里不是可执行文件,而是程序读取并执行文件。然而,如果你运行./hello.exe
的,而不是mono hello.exe
在我发现你的问题,接受的答案更合理(这在一定情况下使用binfmt支持。