2009-06-23 24 views
10

Como todas las distribuciones de Linux usan el mismo kernel, ¿hay alguna diferencia entre sus archivos binarios ejecutables?¿Hay alguna diferencia entre los archivos binarios ejecutables entre distribuciones?

En caso afirmativo, ¿cuáles son las principales diferencias? ¿O eso significa que podemos construir un archivo ejecutable universal de Linux?

+0

"Algo sobre los archivos binarios de Linux": ¿qué tal pasar unos segundos más mejorando el resumen de esta pregunta? – scobi

+0

Siempre puede editar el título/pregunta de otra persona, ¡aunque hágalo con cuidado! –

+0

¿te refieres a universal en las distribuciones de Linux o en las distintas arquitecturas ...? – LB40

Respuesta

12

distribuciones de Linux Todos utilizan el mismo formato binario ELF, pero todavía hay algunas diferencias:

  1. diferentes arco uso de CPU conjunto de instrucciones diferente.
  2. 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 funcionar juntos.
  3. Incluso en el mismo arco, el mismo ABI, esto todavía no significa que podamos copiar un archivo binario en una distribución a otro. Como la mayoría de los archivos binarios no están vinculados estáticamente, entonces dependen de las bibliotecas bajo la distribución, lo que significa que una distribución diferente puede usar diferentes versiones o diferentes configuraciones de compilación de bibliotecas.

Así que si desea que su programa se ejecute en toda la distribución, es posible que tenga que vincular estáticamente una versión que depende únicamente del syscall del kernel, incluso esto solo puede ejecutar un arco especificado.

Si realmente desea ejecutar un programa en cualquier arco, entonces tiene que compilar binarios para todos los arcos, y usar un script de shell para iniciar el correcto.

+0

¡Buena respuesta, gracias! Hace más claro sobre la pregunta –

1

Casi todos los archivos de programa de Linux utilizan el estándar ELF.

+0

Creo que te refieres a ELF –

+0

Gracias - ¡Problemas con los dedos! –

+0

¿Podemos de alguna manera cambiar el ELF del binario? –

12

Todos los puertos Linux (es decir, el kernel de Linux en diferentes procesadores) usan ELF como el formato de archivo para ejecutables y bibliotecas. Un binario ELF específico está etiquetado con una arquitectura/sistema operativo único 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 admiten el formato anterior a.out. (Algunos procesadores son lo suficientemente nuevos como para que nunca haya existido ningún ejecutable para ellos.)

Algunos puertos también admiten otros formatos de archivos ejecutables; por ejemplo, el puerto PA-RISC es compatible con los ejecutables antiguos de HP-UX SOM, y los puertos μ cLinux (nonmmu) admiten su propio formato FLAT.

Linux también tiene binfmt_misc, que permite al usuario registrar manejadores para formatos binarios arbitrarios. Algunas distribuciones aprovechan esto para poder ejecutar aplicaciones Windows, .NET o Java; en realidad todavía está lanzando un intérprete, pero es completamente transparente para el usuario.


Linux en alfa tiene soporte para carga de binarios de Intel, que se ejecutan a través de la 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, quizás registrar una nueva "arquitectura" en ELF, para binarios gordos. Luego, el cargador kernel binfmt debería ser enseñado sobre este nuevo formato, y no querrá perderse el enlazador dinámico ld-linux.so y toda la cadena de herramientas de compilación. Ha habido poco interés en tal característica, y hasta donde sé, nadie está trabajando en algo así.

+0

¿Pero es posible hacer un binario universal de Linux? –

+0

Gracias por su respuesta –

+0

¿Hay alguna manera de listar todos los formatos ejecutables en tiempo de ejecución, p. 'cat/proc/binfmt'? Solo pude enumerar los 'binfmt_misc' con' ls/proc/sys/fs/binfmt_misc'. Lo mejor que tengo ahora es 'ls fs/binfmt *' en el árbol de fuentes. –

1

Old Unixes también usó el formato COFF. Todavía puede encontrar ejecutables de otros tiempos en este formato. Linux todavía tiene soporte (no sé si está compilado en las distribuciones actuales, sin embargo).

+1

Linux omitida directamente de a.out a ELF. Algunos puertos pueden construir la imagen * kernel * en formato ECOFF (MIPS, PowerPC) para compatibilidad con ciertos cargadores de arranque, y Alpha puede tener soporte de carga COFF para compatibilidad con ejecutables no nativos, pero no puedo encontrar ningún rastro más de él en las fuentes modernas del kernel de Linux. – ephemient

1

Si desea crear un programa que se ejecuta una todas las distribuciones de Linux, se puede considerar el uso de lenguajes de script (como Python y Perl) o un plataforma de lenguaje de programación independiente como Java.

Los programas escritos en lenguajes de scripting se cumplen durante el tiempo de ejecución, lo que significa que siempre se compilan para coincidir con la plataforma en la que se ejecutan y, por lo tanto, siempre deben funcionar (dado que las bibliotecas están configuradas correctamente).

Los programas escritos en Java, por otro lado, se compilan antes de distribuirlos, pero se pueden ejecutar en cualquier distribución Linux siempre que tenga una máquina virtual Java instalada. También se pueden ejecutar programas escritos en Java en otros sistemas operativos como MS Windows y Mac OS.

Lo mismo es cierto para muchos programas escritos en Python y Perl; sin embargo, si un programa Python o Perl funcionará en otro sistema operativo depende de qué bibliotecas use ese programa y de si estas bibliotecas están disponibles en los otros sistemas operativos.

Cuestiones relacionadas