Sto imparando C #, quindi ho creato un piccolo programma C # che dice Hello, World!, quindi l'ho compilato mono-csced eseguito con mono:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
Ho notato che quando mi ha colpito TABin bash, Hello.exeè stato caratterizzato eseguibile. In effetti, viene eseguito solo da una shell che carica il nome file!
Hello.exenon è un file ELF con un'estensione divertente:
$ 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 che è un eseguibile collegato staticamente a Microsoft Windows. Rilascialo su una finestra di Windows e verrà (dovrebbe) eseguito.
Ho wineinstallato, ma wine, essendo un layer di compatibilità per le applicazioni di Windows, richiede circa 5 volte più a lungo a correre Hello.execome monoe l'esecuzione direttamente fare, quindi non è wineche lo gestisce.
Sto assumendo c'è qualche monomodulo del kernel installato con monoche intercetta la execchiamata di sistema / s, o di cattura binari che iniziano con 4D 5A, ma lsmod | grep monoe gli amici restituiscono un errore.
Cosa sta succedendo qui e come fa il kernel a sapere che questo eseguibile è speciale?
Solo per la prova che non è la mia magia di funzionamento della shell, ho usato Crap Shell (aka sh) per eseguirlo e funziona ancora in modo nativo.
Ecco il programma completo, poiché un commentatore era 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, nel tuo caso il programma è mono, mentre i miei esempi includono php, python, perl e java. Sospetto che mono consenti l'estensione a un file diverso da .exe ancora eseguito tramite codice. Non dovrebbe dipendere affatto da Windows poiché alla fine si esegue un codice compilato. Tuttavia, se il tuo file sorgente ha un codice dipendente come solo API di Windows, ovviamente devi avere bisogno di vino per eseguire quel file exe.
/etc/magico /usr/share/file/magic(o simile posizione magica) è il file che contiene le informazioni necessarie per poterlo fare.
$ foo.jarpiuttosto che $ java -jar foo.jar- simile a ciò che viene fatto per mono.
php hello.phpopython hello.pyoperl hello.plo in caso di linguaggio compilato come javajava hello, verrebbero eseguiti anche perché i loro non sono eseguibili lì, ma un programma legge ed esegue il file. Tuttavia, se corri./hello.exeinvece delmono hello.exeho trovato la tua domanda e accettato la risposta più ragionevole (che nel caso utilizzi definitivamente il supporto