我正在学习C#,所以我制作了一个名为Hello,World!的C#程序,然后用mono-csc编译并用mono运行它:

$mono-csc Hello.cs

$mono Hello.exe

Hello, World!

我注意到当我用bash命中TAB时,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机器上,它将(应该)运行.

我安装了葡萄酒,但葡萄酒,作为Windows应用程序的兼容层,运行Hello.exe作为单声道并且直接执行它需要大约5倍的时间,所以它不是运行它的葡萄酒.

我假设有一些单声道内核模块安装了mono来拦截exec系统调用/ s,或者捕获以4D 5A开头的二进制文件,但是lsmod | grep mono和friends返回错误.

这里发生了什么,内核如何知道这个可执行文件是特殊的?

只是为了证明它不是我的shell工作魔法,我使用the Crap Shell(也就是sh)运行它并且它仍然本机运行.

这是一个完整的程序,因为评论者很好奇:

using System;

class Hello {

///

/// The main entry point for the application

///

[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系统上).这告诉内核应该为运行检测器提供以MZ(4d5a)开头的二进制文件.后者计算出是使用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 …

标签:linux,mono,executable,cross-compilation

来源: https://codeday.me/bug/20190808/1621428.html

mono linux 运行机制,linux – Mono如何神奇?相关推荐

  1. linux运行隐藏文件,Linux下如何隐藏文件_网站服务器运行维护,Linux,隐藏文件

    linux系统怎样安装软件_网站服务器运行维护 linux系统安装软件的方法:1.使用apt命令进行安装,如[apt install app_name]:2.使用rpm命令进行安装,如[rpm -i ...

  2. linux sysctl机制,Linux操作系统sysctl机制的思想与实现

    续<linux的netlink机制>:其实只要同时提供实现一个内核netlink的内核模块和一个定制用户策略的用户空间netlink程序,你就可以完全控制linux内核了,这里内核的net ...

  3. 深度linux运行wine,Linux系统中的Wine和deepin wine是什么有什么区别

    我们办公和家用的系统一般都是Windows系统,很少用到其他系统.除了常用的Windows系统外,还有其他的,如Linux系统.该系统是开放源码的UNIX操作系统,主要运行在大型服务器和平台上. 有些 ...

  4. linux运行blast,linux blast

    建库 减压后,改名为blast,并在blas目录在建立db文件 1,建立数据库 makeblastdb -in db.fasta -dbtype nucl(prot) -parse_seqids -h ...

  5. linux运行倩女,linux启动脚本添加引用jdk版本倩女

    编译后,退出VisualBasic: 再次运行Project1.exe: 天啦,居然会有错误信息,类已不再支持原来接口 DoUntilDataList.EOF第一,您在屏幕上看不到任何正在发生的事情, ...

  6. mono 直接运行exe linux,mono的安装(简单使用exe文件)

    Linux下mono的安装 第一:下载最新的mono源代码及其所需要的其它代码:(8个) 以及所需要的 fontconfig-2.7.3.tar.gz freetype-2.3.11.tar.gz g ...

  7. linux 的多进程运行机制,Linux 多进程-2

    揭秘文件描述符的本质 1. 文件描述符的本质是数组元素的下标 右侧的表称为 i 节点表,在整个系统中只有1张.该表可以视为结构体数组,该数组的一个元素对应于一个物理文件. 中间的表称为文件表,在整个系 ...

  8. linux模块化机制,Linux模块化机制和module_init

    > 引子:模块化机制优点 模块化机制(module)是Linux系统的一大创新,是Linux驱动开发和运行的基础(当然,module并不仅仅是支撑驱动).其优点在于: 1.在系统运行动态加载模块 ...

  9. linux运行rtsp,Linux下的实时流媒体编程(RTP,RTCP,RTSP)2

    RTP 是目前解决流媒体实时传输问题的最好办法,如果需要在Linux平台上进行实时流媒体编程,可以考虑使用一些开放源代码的RTP库,如LIBRTP. JRTPLIB等.JRTPLIB是一个面向对象的R ...

最新文章

  1. 痛苦是能让人成长的,所以不要害怕遇到痛苦
  2. 6.TMG2010公网发布
  3. 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
  4. Memcached主从复制+keepalived高可用架构
  5. c语言variant是什么变量,介绍一些常用数据类型的使用。先定义一些常见类型变量借以.doc...
  6. css3 menu 手机菜单3
  7. 丰田chr内外循环怎么区分_雨季车窗起雾怎么办?空调内外循环别错用
  8. Unty中通过镜像优化HDRI全景图体积
  9. Android Webview 设置Cookie问题
  10. python拟合直线的斜率_Python:直线,斜率k是已知的,一点P1是已知的,长度P1P2是已知的,如何得到P2?...
  11. Keil黑色背景页面设置
  12. 计算机里面有盐有糖O(∩_∩)O哈哈~
  13. 前端、后台、客户端以及服务器
  14. 这个是可以将得到速查编码的存储过程 如 中国人 可以得到 ZGR
  15. CMWAP和CMNET 的区别与适用范围
  16. APl DOM文档对象模型
  17. Excel - 学习 - 笔记2: Excel 数据格式
  18. WebGl 球面计算公式
  19. Python:如何在代码完成时发出警报声?
  20. 笔记本计算机虚拟技术,教大家联想笔记本电脑如何打开Intel 虚拟化技术

热门文章

  1. html checkbox 透明度,【求助】关于表达式checkbox中不透明度的设置
  2. python匿名函数使用
  3. html5移动端开发(rem和媒体查询@media)
  4. Kotlin 条件控制(六)
  5. Html5中的徽章,CSS 常见样式 特殊用法 贯穿线徽章箭头
  6. 怎么看电脑配置高不高_辣椒产量高不高?关键看播种前的种子处理,你知道怎么做吗?...
  7. linux乱码的文件怎么删除,如何删除Linux的乱码文件
  8. 自检代码中trustmanager漏洞_Windows内核漏洞利用教程
  9. c语言求e近似值精度在10e6,中石油2013秋季学期《C语言》补考在线适用于2014年4月...
  10. php 5.4.39 安装,Lamp 安装(CentOS6.6, php-5.4.39, httpd-2.4.12, mysql-5.6.24)