Как Linux определяет, какие средства использовать для запуска (нетекстового) двоичного файла?

23

Я понимаю, что Linux использует строку shebang, чтобы определить, какой интерпретатор использовать для языков сценариев, но как он работает для двоичных файлов?

Я имею в виду, что могу запускать бинарные файлы Linux и установить как двоичные файлы Wine, так и mono , Windows и .NET. И для всех них это просто ./binary-name(если не в PATH), чтобы запустить его.

Как Linux определяет, что данный двоичный файл должен быть запущен как собственный двоичный файл Linux, как собственный двоичный файл Windows (с использованием средств Wine ) или как двоичный файл Windows .NET (с использованием средств mono )?

голем
источник

Ответы:

29

Одним словом: binfmt_misc . Это специфичное для Linux, непереносимое средство.

Есть несколько форматов, которые распознаются ядром со встроенной логикой. А именно, это формат ELF (для обычных двоичных файлов) и соглашение Шебанга (для скриптов). (спасибо zwol за следующую часть ответа). Кроме того, Linux распознает несколько встроенных форматов эзотерических или устаревших или совместимых. Вы, вероятно, не столкнетесь с ними. Это a.out"em86", "flat" и "elf_fdpic".

Все остальное должно быть зарегистрировано через систему binfmt_misc. Эта система позволяет вам зарегистрировать в ядре простую проверку шаблонов на основе магического числа и соответствующего интерпретатора.

Celada
источник
6
Хотя OP явно запрашивал Linux, стоит отметить, что, в отличие от многих других решений, которые работают как в Linux, так и в других Unix-подобных системах, это решение полностью зависит от Linux.
cubuspl42
6
Возможно, он не скомпилирован, но дерево исходных a.outтекстов Linux по-прежнему включает встроенную поддержку форматов "em86", "flat" и "elf_fdpic", а также обычный ELF. Все из них, кроме em86, выглядят как собственные двоичные исполняемые форматы; мне не хватает информации, чтобы понять, когда можно использовать «flat» или «elf_fdpic». em86, по-видимому, является механизмом pre-binfmt_misc для запуска конкретного эмулятора x86, вероятно, он все еще работает для обратной совместимости.
Звол
2
В Debian Linux (я не проверял RedHat и другие) команда для отображения всех текущих записей binfmtupdate-binfmts --display
golem