Sto imparando C #, quindi ho creato un piccolo programma C # che dice Hello, World!
, quindi l'ho compilato mono-csc
ed eseguito con mono
:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
Ho notato che quando mi ha colpito TAB
in bash
, Hello.exe
è stato caratterizzato eseguibile. In effetti, viene eseguito solo da una shell che carica il nome file!
Hello.exe
non è 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..............
MZ
significa che è un eseguibile collegato staticamente a Microsoft Windows. Rilascialo su una finestra di Windows e verrà (dovrebbe) eseguito.
Ho wine
installato, ma wine
, essendo un layer di compatibilità per le applicazioni di Windows, richiede circa 5 volte più a lungo a correre Hello.exe
come mono
e l'esecuzione direttamente fare, quindi non è wine
che lo gestisce.
Sto assumendo c'è qualche mono
modulo del kernel installato con mono
che intercetta la exec
chiamata di sistema / s, o di cattura binari che iniziano con 4D 5A
, ma lsmod | grep mono
e 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/magic
o /usr/share/file/magic
(o simile posizione magica) è il file che contiene le informazioni necessarie per poterlo fare.
$ foo.jar
piuttosto che $ java -jar foo.jar
- simile a ciò che viene fatto per mono.
php hello.php
opython hello.py
operl hello.pl
o 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.exe
invece delmono hello.exe
ho trovato la tua domanda e accettato la risposta più ragionevole (che nel caso utilizzi definitivamente il supporto