Saya sedang belajar C #, jadi saya membuat program C # kecil yang mengatakan Hello, World!, lalu mengompilasinya mono-cscdan menjalankannya dengan mono:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
Saya menyadari bahwa ketika saya memukul TABdi bash, Hello.exeditandai dieksekusi. Memang, ini dijalankan hanya dengan sebuah shell memuat nama file!
Hello.exeadalah tidak file ELF dengan ekstensi file yang lucu:
$ 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..............
MZberarti itu adalah Microsoft Windows yang dapat dieksekusi yang terhubung secara statis. Jatuhkan ke kotak Windows, dan itu akan (harus) berjalan.
Saya telah wineterinstal, tapi wine, menjadi lapisan kompatibilitas untuk aplikasi Windows, membutuhkan waktu sekitar 5x lebih lama untuk menjalankan Hello.exesebagai monodan dijalankan langsung lakukan, sehingga tidak wineyang berjalan itu.
Saya berasumsi ada beberapa monomodul kernel yang diinstal dengan monoyang mencegat execsyscall / s, atau menangkap binari yang dimulai dengan 4D 5A, tetapi lsmod | grep monodan teman-teman mengembalikan kesalahan.
Apa yang terjadi di sini, dan bagaimana kernel tahu bahwa ini executable khusus?
Hanya untuk membuktikan itu bukan sihir shell saya , saya menggunakan Crap Shell (alias sh) untuk menjalankannya dan masih berjalan secara asli.
Inilah programnya secara penuh, karena seorang komentator ingin tahu:
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, dalam program kasus Anda adalah mono, sedangkan contoh saya termasuk php, python, perl dan java. Saya curiga jika mono mengizinkan ekstensi selain file .exe masih dieksekusi melalui kode. Seharusnya tidak bergantung sama sekali pada windows karena akhirnya ini menjalankan kode yang dikompilasi. Namun jika file sumber Anda memiliki beberapa kode dependen seperti windows only API maka jelas Anda harus memerlukan anggur untuk menjalankan file exe itu.
/etc/magicatau /usr/share/file/magic(atau lokasi magis serupa) adalah file yang berisi informasi yang diperlukan untuk dapat melakukan ini.
$ foo.jardaripada $ java -jar foo.jar- mirip dengan apa yang dilakukan untuk mono.
php hello.phpataupython hello.pyatauperl hello.pljika bahasa dikompilasi seperti javajava hellomereka juga akan berjalan karena mereka tidak dapat dieksekusi di sana tetapi sebuah program membaca dan mengeksekusi file. Namun jika Anda menjalankan./hello.exealih-alihmono hello.exe, saya menemukan pertanyaan Anda dan menerima jawaban yang lebih masuk akal (yang dalam kasus pasti menggunakan dukungan