Saya sedang belajar C #, jadi saya membuat program C # kecil yang mengatakan Hello, World!
, lalu mengompilasinya mono-csc
dan menjalankannya dengan mono
:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
Saya menyadari bahwa ketika saya memukul TAB
di bash
, Hello.exe
ditandai dieksekusi. Memang, ini dijalankan hanya dengan sebuah shell memuat nama file!
Hello.exe
adalah 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..............
MZ
berarti itu adalah Microsoft Windows yang dapat dieksekusi yang terhubung secara statis. Jatuhkan ke kotak Windows, dan itu akan (harus) berjalan.
Saya telah wine
terinstal, tapi wine
, menjadi lapisan kompatibilitas untuk aplikasi Windows, membutuhkan waktu sekitar 5x lebih lama untuk menjalankan Hello.exe
sebagai mono
dan dijalankan langsung lakukan, sehingga tidak wine
yang berjalan itu.
Saya berasumsi ada beberapa mono
modul kernel yang diinstal dengan mono
yang mencegat exec
syscall / s, atau menangkap binari yang dimulai dengan 4D 5A
, tetapi lsmod | grep mono
dan 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/magic
atau /usr/share/file/magic
(atau lokasi magis serupa) adalah file yang berisi informasi yang diperlukan untuk dapat melakukan ini.
$ foo.jar
daripada $ java -jar foo.jar
- mirip dengan apa yang dilakukan untuk mono.
php hello.php
ataupython hello.py
atauperl hello.pl
jika bahasa dikompilasi seperti javajava hello
mereka juga akan berjalan karena mereka tidak dapat dieksekusi di sana tetapi sebuah program membaca dan mengeksekusi file. Namun jika Anda menjalankan./hello.exe
alih-alihmono hello.exe
, saya menemukan pertanyaan Anda dan menerima jawaban yang lebih masuk akal (yang dalam kasus pasti menggunakan dukungan