单声道魔术如何?

我正在学习C#,所以我制作了一个小C#程序,说Hello, World!,然后使用进行编译mono-csc并运行mono

$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!

我注意到,当我点击TABbashHello.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.exemono,并执行它直接做的,所以这并不是wine说运行它。

我假设mono安装了一些内核模块,mono内核模块拦截execsyscall / 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");
  }
}
斯蒂芬·基特

这实际上是binfmt_misc:它允许内核被告知如何运行未知的二进制文件。看一下内容/proc/sys/fs/binfmt_misc在您看到的文件中,应该解释一下如何运行Mono二进制文件:

enabled
interpreter /usr/lib/binfmt-support/run-detectors
flags:
offset 0
magic 4d5a

(在Debian系统上)。这告诉内核,应将MZ4d5a开头的二进制文件提供给run-detectors后者指出是使用Mono还是Wine来运行二进制文件。

二进制类型可以随时添加,删除,启用和禁用。有关详细信息,请参见上面的文档(语义令人惊讶,此处使用的虚拟文件系统的行为并不完全类似于标准文件系统)。/proc/sys/fs/binfmt_misc/status给出全局状态,每个二进制“描述符”显示其各自的状态。禁用的另一种方法binfmt_misc是卸载其内核模块(如果它是作为模块构建的)。这也意味着可以将其列入黑名单,从而完全避免使用它。

此功能允许支持新的二进制类型,例如MZ可执行文件(包括Windows PE和PE +二进制文件,还包括DOS和OS / 2二进制文件!),Java JAR文件...,还允许在以下位置支持已知的二进制类型。新架构,通常使用Qemu;因此,使用适当的库,您可以在Intel处理器上透明地运行ARM Linux二进制文件!

您的问题源于交叉编译(尽管在.NET方面),但提出了以下警告binfmt_misc:当您尝试在可以运行交叉编译的二进制文件的系统上交叉编译时,某些配置脚本行为不当。通常,检测交叉编译涉及构建二进制文件并尝试运行它。如果运行,则不会交叉编译,否则,就不会编译(或者编译器坏了)。autoconf在这种情况下,通常可以通过显式指定构建和宿主体系结构来修复脚本,但是有时您必须binfmt_misc暂时禁用它

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章