Я вивчаю 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який перехоплює execsyscall / 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.