¿Cómo determina Linux qué facilidades usar para ejecutar un binario (sin texto)?

23

Entiendo que Linux usa la línea shebang para determinar qué intérprete usar para los lenguajes de script, pero ¿cómo funciona para los binarios?

Quiero decir que puedo ejecutar binarios de Linux, y haber instalado los binarios wine y mono , nativos de Windows y .NET. Y para todos ellos es solo ./binary-name(si no en PATH) ejecutarlo.

¿Cómo determina Linux que un binario dado debe ejecutarse como un binario nativo de Linux, como un binario nativo de Windows (utilizando instalaciones de Wine ) o como un binario de Windows .NET (utilizando instalaciones mono )?

golem
fuente

Respuestas:

29

En una palabra: binfmt_misc . Es una instalación no portátil específica de Linux.

Hay un par de formatos reconocidos por el núcleo con lógica incorporada. A saber, estos son el formato ELF (para binarios normales) y la convención shebang (para scripts). (Gracias a zwol por la siguiente parte de la respuesta). Además, Linux reconoce un par de formatos esotéricos u obsoletos o de compatibilidad incorporados. Probablemente no los encuentres. Son a.out"em86", "flat" y "elf_fdpic".

Todo lo demás debe registrarse a través del sistema binfmt_misc. Este sistema le permite registrar con el núcleo una verificación de patrón simple basada en un número mágico y el intérprete correspondiente.

Celada
fuente
66
Aunque el OP solicitó Linux explícitamente, vale la pena señalar que, a diferencia de muchas otras soluciones que funcionan tanto en Linux como en otros sistemas similares a Unix, esta es totalmente específica de Linux.
cubuspl42
66
Es posible que no esté compilado, pero el árbol de fuentes de Linux aún incluye soporte intrínseco para los a.outformatos "em86", "flat" y "elf_fdpic", así como ELF normal. Todos esos, excepto em86, parecen ser formatos ejecutables binarios nativos; no hay suficiente información para que yo sepa cuándo usaría "flat" o "elf_fdpic". em86 parece ser un mecanismo pre-binfmt_misc para ejecutar un emulador x86 en particular, probablemente solo esté disponible para la compatibilidad con versiones anteriores.
zwol
2
En Debian Linux (no verifiqué RedHat y otros), el comando para mostrar todas las entradas binfmt actuales esupdate-binfmts --display
golem