Estou aprendendo c #, então fiz um pequeno programa em c # que diz Hello, World!, compilei mono-csce executei com mono:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
Notei que quando eu bati TABem bash, Hello.exefoi marcado executável. Na verdade, ele roda apenas por um shell que carrega o nome do arquivo!
Hello.exenão é um arquivo ELF com uma extensão de arquivo engraçada:
$ 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..............
MZsignifica que é um executável estaticamente vinculado do Microsoft Windows. Solte-o em uma caixa do Windows e ele (deve) ser executado.
Tenho wineinstalado, mas wine, sendo uma camada de compatibilidade para aplicativos Windows, leva cerca de 5x mais tempo para executar Hello.execomo monoe executá-lo diretamente que, portanto, não é wineque vai.
Eu estou assumindo que há algum monomódulo do kernel instalado com monoque intercepta o execsyscall / s ou captura binários que começam com 4D 5A, mas os lsmod | grep monoamigos retornam um erro.
O que está acontecendo aqui e como o kernel sabe que esse executável é especial?
Só para provar que não é a minha mágica de trabalho do shell, usei o Crap Shell (aka sh) para executá-lo e ele ainda é executado de forma nativa.
Aqui está o programa na íntegra, uma vez que um comentarista estava curioso:
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, no seu caso o programa é mono, enquanto meus exemplos incluem php, python, perl e java. Eu suspeito que se mono permitir extensão para outro arquivo que não seja .exe ainda executado via código. Não deve depender absolutamente do Windows, pois, finalmente, este é um código compilado. No entanto, se o seu arquivo de origem tiver algum código dependente, como APIs apenas do Windows, obviamente você precisará do wine para executar esse arquivo exe.
/etc/magicou /usr/share/file/magic(ou local mágico semelhante) é o arquivo que contém as informações necessárias para poder fazer isso.
$ foo.jarpouco do que $ java -jar foo.jar- semelhante ao que é feito para mono.
php hello.phpoupython hello.pyouperl hello.plou no caso de linguagem compilada como java,java helloeles também serão executados, pois não são executáveis lá, mas um programa lê e executa o arquivo. No entanto, se você executar./hello.exeem vezmono hello.exedo que eu encontrei sua pergunta e resposta aceita mais razoável (que no caso definitivamente usar binfmt-apoio.