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


23

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

Я маю на увазі, що я можу запускати бінарні файли Linux, встановивши як винні, так і моно- , рідні Windows і .NET бінарні файли. І для всіх їх просто ./binary-name(якщо не в PATH) це запустити.

Як Linux визначає, що певний двійковий файл повинен бути запущений як нативний бінарний файл Linux, як власний бінарний файл Windows (використовуючи винні засоби) або як двійковий файл Windows .NET (використовуючи моно- засоби)?

Відповіді:


29

Одним словом: binfmt_misc . Це специфічне для Linux портативне обладнання.

Є пара форматів, які розпізнаються ядром із вбудованою логікою. А саме, це формат ELF (для звичайних бінарних файлів) та конвенція shebang (для сценаріїв). (спасибі zwol за наступну частину відповіді). Крім того, Linux розпізнає пару езотеричних або застарілих або вбудованих форматів сумісності. Ви, мабуть, не зіткнетеся з ними. Це a.out"em86", "flat" та "elf_fdpic".

Все інше повинно бути зареєстровано через систему binfmt_misc. Ця система дозволяє зареєструвати в ядрі просту перевірку шаблону на основі магічного числа та відповідного інтерпретатора.


6
Незважаючи на те, що ОП просила Linux прямо, явно варто відзначити, що на відміну від багатьох інших рішень, що працюють як на Linux, так і на інших системах, схожих на Unix, це повністю специфічно для Linux.
cubuspl42

6
Він може бути не скомпільований у, але дерево джерела Linux все ще містить внутрішню підтримку a.outформатів "em86", "flat" та "elf_fdpic", а також звичайний ELF. Усі ці, за винятком em86, схожі на вбудовані бінарні формати; для мене недостатньо інформації, щоб зрозуміти, коли можна використовувати "flat" або "elf_fdpic". em86, схоже, є механізмом pre-binfmt_misc для запуску певного емулятора x86, він, ймовірно, існує лише для зворотної сумісності.
zwol

2
На Debian Linux (я не перевіряв RedHat та інших) командою для відображення всіх поточних записів binfmt єupdate-binfmts --display
golem
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.