Выполнение двоичных файлов в ядре Linux контролируется модулем binfmt_misc
(сокращение от «разные двоичные форматы»). Это работает так, что ядро просматривает первые несколько байтов файла и определяет, существует ли « магическое число », которое характеризует известный формат файла. Идея состоит в том, что если ядро видит магическое число исполняемого файла .NET, оно вызывает mono
; если он видит магическое число jar (двоичный файл виртуальной машины Java), он вызывает JRE; и т.п.
Проблема с Mono и Wine состоит в том, что магическое число одинаково - исполняемый файл .NET - исполняемый файл Windows. Если оба формата зарегистрированы с binfmt_misc
, какой из них зарегистрирован последним, побеждает. К сожалению.
В системе, производной от Debian, магическое число для исполняемых файлов Windows напрямую не вызывает wine или mono: оно проходит через скрипт, который выполняет дополнительные тесты, чтобы решить, какую среду использовать. Рассматриваемый скрипт изначально был написан для Debian; он может использоваться другими дистрибутивами (например, Ubuntu сохранил его).
Видимо ваш дистрибутив (какой? ты не говоришь!) не использует это Первое, что нужно проверить, будет ли в некоторых обновлениях, которые вы не применяли, что-то похожее. Если вы хотите портировать механизм, вот где найти биты; это небольшая задача программирования. Сценарий представляет собой /usr/share/binfmt-support/run-detectors
в пакете binfmt-support (библиотеки также нужны в /usr/share/perl5/Binfmt
); для моно детектор - это /usr/lib/cli/binfmt-detector-cli
в пакете mono-common или mono-runtime .
Если в вашем дистрибутиве нет особой поддержки, и вам не нужны винные бинарные файлы, более простой маршрут будет проще. Модуль binfmt_misc
управляется через каталог /proc/sys/fs/binfmt_misc
. Вы можете зарегистрировать формат, написав в /proc/sys/fs/binfmt_misc/register
; каждый файл в этом каталоге кроме register
и status
представляет зарегистрированный формат. Будьте внимательны, когда пишете для register
: если вы случайно зарегистрируете магическое число, которое соответствует собственным исполняемым файлам Linux (ELF), вы, вероятно, подключите свою систему без каких-либо мер, кроме перезагрузки. Чтобы отменить регистрацию формата wine
, введите -1
в /proc/sys/fs/binfmt_misc/wine
. Модуль binfmt_misc
в Documentation/binfmt_misc.txt.gz
в документации ядра Linux.
Одним из решений вашей проблемы будет отмена регистрации формата вина; вам придется делать это после того, как загрузочный скрипт зарегистрирует двоичные форматы. Альтернативное решение - выяснить, где в процессе загрузки зарегистрирован формат вина, и пропустить эту часть. Третье решение - найти способ отличить исполняемые файлы .NET от других исполняемых файлов Windows и зарегистрировать магическое число .NET после общего магического номера Windows.