Comment Linux détermine-t-il les fonctionnalités à utiliser pour exécuter un binaire (non textuel)?

23

Je comprends que Linux utilise la ligne shebang pour déterminer quel interpréteur utiliser pour les langages de script, mais comment cela fonctionne-t-il pour les binaires?

Je veux dire que je peux exécuter des binaires Linux et avoir installé à la fois Wine et mono , Windows natif et binaires .NET. Et pour tous, c'est juste ./binary-name(sinon dans PATH) de l'exécuter.

Comment Linux détermine-t-il qu'un binaire donné doit être exécuté en tant que binaire natif Linux, en tant que binaire natif Windows (en utilisant les installations de Wine) ou en tant que binaire Windows .NET (en utilisant les installations mono )?

Golem
la source

Réponses:

29

En un mot: binfmt_misc . Il s'agit d'une installation non portable spécifique à Linux.

Il existe quelques formats reconnus par le noyau avec une logique intégrée. À savoir, ce sont le format ELF (pour les binaires normaux) et la convention shebang (pour les scripts). (merci à zwol pour la partie suivante de la réponse). De plus, Linux reconnaît quelques formats intégrés ésotériques ou obsolètes ou compatibles. Vous ne les rencontrerez probablement pas. Ce sont a.out"em86", "flat" et "elf_fdpic".

Tout le reste doit être enregistré via le système binfmt_misc. Ce système vous permet d'enregistrer auprès du noyau une simple vérification de modèle basée sur un nombre magique et l'interpréteur correspondant.

Celada
la source
6
Bien que l'OP ait explicitement demandé Linux, il convient de noter que contrairement à de nombreuses autres solutions qui fonctionnent à la fois sur Linux et sur d'autres systèmes de type Unix, celle-ci est totalement spécifique à Linux.
cubuspl42
6
Il n'est peut-être pas compilé, mais l'arborescence des sources Linux inclut toujours la prise en charge intrinsèque des a.outformats «em86», «flat» et «elf_fdpic» ainsi que ELF normal. Tous ceux sauf em86 semblent être des formats exécutables binaires natifs; il n'y a pas assez d'informations pour que je sache quand on utiliserait "flat" ou "elf_fdpic". em86 semble être un mécanisme pré-binfmt_misc pour exécuter un émulateur x86 particulier, il n'est probablement encore là que pour la compatibilité descendante.
zwol
2
Sur Debian Linux (je n'ai pas vérifié RedHat et autres) la commande pour afficher toutes les entrées binfmt actuelles estupdate-binfmts --display
golem