Я вивчаю C #, тому я створив невелику програму C #, яка каже Hello, World!
, потім склав її mono-csc
і запустив mono
:
$ mono-csc Hello.cs
$ mono Hello.exe
Hello, World!
Я помітив , що коли я потрапив TAB
в bash
, Hello.exe
був відзначений виконуваним. Дійсно, він працює лише оболонкою, що завантажує ім'я файлу!
Hello.exe
це НЕ файл ELF з кумедним розширенням файлу:
$ 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
означає, що це стаціонарно пов'язаний виконуваний файл Microsoft Windows. Перекиньте його на вікно Windows, і воно (повинно) працювати.
Я wine
встановив, але wine
, будучи шаром сумісності для додатків для Windows, потрібно запустити приблизно 5 разів стільки часу, Hello.exe
як mono
і виконати його безпосередньо, так що це не wine
те, що він запускає.
Я припускаю, що mono
встановлено якийсь модуль ядра, mono
який перехоплює exec
syscall / s або ловить двійкові файли, які починаються з цього 4D 5A
, але lsmod | grep mono
друзі повертають помилку.
Що тут відбувається, і як ядро знає, що цей виконуваний файл є особливим?
Просто на доказ, що це не моя магія, що працює з оболонкою, я використовував Crap Shell (ака sh
), щоб запустити її, і вона все ще працює на самому справі.
Ось програма в повному обсязі, оскільки коментатор був цікавим:
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
, у вашому випадку програма є моно, тоді як мої приклади включають php, python, perl та java. Я підозрюю, якщо моно дозволяють розширення на інший, ніж .exe файл, все ще виконується за допомогою коду. Це взагалі не повинно залежати від windows, оскільки нарешті це виконується складеним кодом. Однак якщо у вашому вихідному файлі є якийсь залежний код, наприклад API лише для Windows, тоді, очевидно, для запуску цього EXE-файлу вам знадобиться вино.
/etc/magic
або /usr/share/file/magic
(або подібне магічне розташування) - це файл, який містить інформацію, необхідну для того, щоб зробити це.
$ foo.jar
а не $ java -jar foo.jar
- аналогічно тому, що робиться для моно.
php hello.php
абоpython hello.py
абоperl hello.pl
або у випадку складеної мови на зразок java,java hello
вони також будуть виконуватись, оскільки їх там не виконується, але файл зчитування та виконання програми. Однак якщо ви біжите./hello.exe
замістьmono hello.exe
того, я знайшов ваше запитання та прийняв відповідь більш розумною (що у випадку, коли ви обов'язково використовуєте підтримку binfmt.