Я изучаю 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системный вызов / s или перехватывает двоичные файлы, которые начинаются с 4D 5A, но lsmod | grep monoдрузья возвращают ошибку.
Что здесь происходит, и как ядро узнает, что этот исполняемый файл особенный?
Просто для доказательства , что это не моя оболочка работает магия, я использовал гречиху 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 файла, все еще выполняется с помощью кода. Он вообще не должен зависеть от окон, так как, наконец, это выполнение скомпилированного кода. Однако, если ваш исходный файл имеет некоторый зависимый код, такой как API только для Windows, тогда, очевидно, вам нужно Wine для запуска этого 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-support.