Todos los puertos de Linux (es decir, el kernel de Linux en diferentes procesadores) usan ELF como formato de archivo para ejecutables y bibliotecas. Un archivo binario ELF específico está etiquetado con una única arquitectura/SO en el que se puede ejecutar (aunque algunos sistemas operativos tienen compatibilidad para ejecutar archivos binarios ELF de otros sistemas operativos).
La mayoría de los puertos tienen soporte para el antiguo formato a.out. (Algunos procesadores son tan nuevos que nunca han existido ejecutables a.out para ellos).
Algunos puertos también admiten otros formatos de archivos ejecutables; por ejemplo, el puerto PA-RISC es compatible con los antiguos ejecutables SOM de HP-UX y los puertos μcLinux (nonmmu) admiten su propio formato FLAT.
Linux también tiene binfmt_misc
, que permite que el espacio de usuario registre controladores para formatos binarios arbitrarios. Algunas distribuciones se aprovechan de esto para poder ejecutar aplicaciones de Windows, .NET o Java; en realidad, sigue iniciando un intérprete, pero es completamente transparente para el usuario.
Linux en Alpha tiene soporte para cargar binarios de Intel, que se ejecutan a través de em86
emulador.
Es posible registrar binfmt_misc
para ejecutables de otras arquitecturas, para ejecutar con qemu-user.
En teoría, se podría crear un nuevo formato, tal vez registrar una nueva "arquitectura" en ELF, para archivos binarios gordos. Entonces el núcleo binfmt
loader tendría que aprender sobre este nuevo formato, y no querrá perderse el ld-linux.so
enlazador dinámico y toda la cadena de herramientas de compilación. Ha habido poco interés en esta función y, que yo sepa, nadie está trabajando en nada parecido.
Todas las distribuciones de Linux usan el mismo formato binario ELF, pero todavía hay algunas diferencias:
- diferentes arcos de cpu usan diferentes conjuntos de instrucciones.
- el mismo arco de cpu puede usar diferentes ABI, ABI define cómo usar el archivo de registro, cómo llamar/devolver una rutina. Diferentes ABI no pueden trabajar juntas.
- Incluso en el mismo arco, la misma ABI, esto no significa que podamos copiar un archivo binario en una distribución a otra. Dado que la mayoría de los archivos binarios no están vinculados estáticamente, dependen de las bibliotecas de la distribución, lo que significa que una distribución diferente puede usar versiones diferentes o una configuración de compilación diferente de las bibliotecas.
Entonces, si desea que su programa se ejecute en todas las distribuciones, es posible que deba vincular estáticamente una versión que dependa solo de la llamada al sistema del kernel, incluso esto solo puede ejecutar un arco específico.
Si realmente desea ejecutar un programa en cualquier arco, debe compilar archivos binarios para todos los arcos y usar un script de shell para iniciar el correcto.
Casi todos los archivos de programa de Linux usan el estándar ELF.