binfmt_misc ( Miscellaneous Binary Format ) es una capacidad del núcleo Linux que permite reconocer formatos de archivos ejecutables arbitrarios y pasarlos a ciertas aplicaciones de espacio de usuario , como emuladores y máquinas virtuales . [1] Es uno de varios controladores de formato binario en el núcleo que participan en la preparación de un programa de espacio de usuario para su ejecución. [2]
Los formatos ejecutables se registran a través de la interfaz de sistema de archivos de propósito especial binfmt_misc
(normalmente montada bajo parte de /proc ). Esto se hace directamente enviando secuencias especiales al register
archivo procfs o utilizando un contenedor como el paquete binfmt-support de las distribuciones basadas en Debian [3] o el de systemd . [4] [5]systemd-binfmt.service
El register
archivo contiene líneas que definen los tipos de ejecutables que se deben manejar. Cada línea tiene el formato:
:name:type:offset:magic:mask:interpreter:flags
name
es el nombre del formato binario.type
es o E
bienM
E
, el formato del archivo ejecutable se identifica por su extensión de nombre de archivo : magic
es la extensión del archivo que se asociará con el formato binario; offset
y mask
se ignoran.M
, el formato se identifica mediante un magic
número absoluto offset
(por defecto 0
) en el archivo y mask
es una máscara de bits (por defecto todos 0xFF
) que indica qué bits del número son significativos.interpreter
es un programa que se ejecutará con el archivo correspondiente como argumento.flags
(opcional) es una cadena de letras, cada una de las cuales controla un determinado aspecto de interpreter
la invocación:P
para preservar el nombre del programa original escrito por el usuario en la línea de comandos, agregando ese nombre a argv
; el usuario interpreter
debe tener esto en cuenta para poder pasar correctamente ese parámetro adicional al programa interpretado como su argv[0]
.O
para abrir el archivo del programa y pasar su descriptor de archivo para interpreter
que pueda leer un archivo que de otro modo sería ilegible (para el cual el usuario no tiene el permiso "Leer" ).C
para determinar nuevas credenciales de proceso basadas en el archivo de programa en lugar del interpreter
archivo (ver setuid ); implica O
bandera.F
para hacer que el kernel abra el binario en el momento de la configuración en lugar de hacerlo de manera diferida en el momento del inicio, de modo que también esté disponible dentro de otros espacios de nombres de montaje y chroots.Cada formato tiene una entrada de archivo correspondiente en el /proc/sys/fs/binfmt_misc
directorio que puede leerse para obtener información sobre un formato de archivo determinado.
$ echo -1 >/proc/sys/fs/binfmt_misc/status # todas las entradas $ echo -1 >/proc/sys/fs/binfmt_misc/qemu-xtensa # entrada única
:DOSWin:M::MZ::/usr/bin/wine:
Entregará todos esos archivos a Wine (asumiendo que son ejecutables normales de MS-DOS o Microsoft Windows ):CLR:M::MZ::/usr/bin/mono:
entregará dichos archivos a Mono (asumiendo que son ejecutables .NET ) [7] [8]:WSLInterOP:M::MZ::/init:P
.