¿Cuál es la diferencia entre los archivos ELF y los archivos bin?
97
Las imágenes finales producidas por los compiladores contienen tanto el archivo bin como el archivo ELf con formato de cargador extendido, cuál es la diferencia entre los dos, especialmente la utilidad del archivo ELF.
Esto es lo que NASM tiene que decir . No es específico de ARM, pero es probable que sea el mismo concepto. Por ejemplo, si compila un archivo que contiene solo NOPsin -f(o -fbin), se compila en un solo byte 0x90, en lugar de un contenedor ELF de 400 bytes con -felf32. Así que solo el código sin formato, no los metadatos del contenedor. NASM dice que se usa principalmente para archivos .COM y .SYS de MS-DOS . sectionLas directivas se ignoran en su mayoría y solo generan alineación.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Esta es una forma en la que los archivos bin pueden ser útiles: para crear un sector de arranque para implementar sistemas operativos: stackoverflow.com/a/32483545/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Respuestas:
94
Un archivo Bin es un archivo binario puro sin reparaciones o reubicaciones de memoria, lo más probable es que tenga instrucciones explícitas para cargarse en una dirección de memoria específica. Mientras....
Los archivos ELF tienen un formato ejecutable enlazable que consiste en búsquedas de símbolos y una tabla reubicable, es decir, el kernel puede cargarlos en cualquier dirección de memoria y, automáticamente, todos los símbolos utilizados se ajustan al desplazamiento desde esa dirección de memoria donde fue cargado en. Por lo general, los archivos ELF tienen varias secciones, como 'datos', 'texto', 'bss', por nombrar solo algunas ... es dentro de esas secciones donde el tiempo de ejecución puede calcular dónde ajustar las referencias de memoria del símbolo dinámicamente en tiempo de ejecución.
"lo más probable es que tenga instrucciones explícitas para cargarse en una dirección de memoria específica": ¿significa esto que el proceso de generación del archivo bin agrega código adicional para cargar datos en una dirección específica?
Penghe Geng
1
Por lo que he aprendido, el archivo bin es como ejecutar el programa desde el desplazamiento 0 y el segmento de datos está incrustado dentro. Si esto está mal, por favor corríjame.
Martin Kersten
@MartinKersten correcto, los archivos bin comienzan desde el desplazamiento 0.
t0mm13b
1
@ t0mm13b Entonces, los archivos .elf se pueden grabar en un microcontrolador como un archivo .hex normal, pero requiere más memoria flash, y cada vez que se reinicia el micro, ¿las direcciones de las secciones cambian?
Aelgawad
@BlackyDucky, no creo que eso sea posible. Si un microcontrolador intentara ejecutar datos ELF directamente, malinterpretaría los encabezados y otros datos como instrucciones, ¿verdad?
iX3
40
Un archivo bin son solo los bits y bytes que van a la rom o una dirección particular desde la que ejecutará el programa. Puede tomar estos datos y cargarlos directamente tal como están, aunque necesita saber cuál es la dirección base, ya que normalmente no está allí.
Un archivo elf contiene la información del contenedor, pero está rodeado de mucha otra información, información de depuración posible, símbolos que pueden distinguir el código de los datos dentro del binario. Permite más de un fragmento de datos binarios (cuando vuelca uno de estos en un contenedor, obtiene un archivo de contenedor grande con datos de relleno para rellenarlo en el siguiente bloque). Le dice cuánto binario tiene y cuántos datos bss hay que desea inicializar a ceros (las herramientas gnu tienen problemas para crear archivos bin correctamente).
El formato de archivo elf es estándar, arm publica sus mejoras / variaciones en el estándar. Recomiendo a todos que escriban un programa de análisis elf para comprender lo que hay allí, no se molesten con una biblioteca, es bastante simple usar la información y las estructuras en la especificación. Ayuda a superar los problemas de GNU en general al crear archivos .bin, así como a depurar scripts del enlazador y otras cosas que pueden ayudar a estropear la salida de bin o elf.
0x7C00 suena como un gestor de arranque que no usa necesariamente elf. esta es una pregunta genérica. un sistema operativo tendría reglas para los espacios de direcciones (virtuales), la cadena de herramientas tendría que apuntar a las reglas del sistema operativo, luego el formato de archivo indicaría elementos cargables con direcciones más un punto de entrada una vez cargados, además de otras cosas. elf es solo un contenedor, como una caja, debe empaquetarlo correctamente para el caso de uso objetivo.
old_timer
1
si desea imprimir algún ascii en el vga, escribe un programa para hacer eso que tiene algunos datos o genera matemáticamente los datos sobre la marcha o alguna combinación, luego carga ese programa en el espacio de código definido por el sistema operativo y luego ejecuta eso. Por lo general, no introduces datos directamente en un periférico físico, y es el raro sistema operativo el que te permite hacer eso de todos modos, o permitir que su cargador lo haga.
old_timer
1
para bare metal, especialmente si este archivo elf es el gestor de arranque y / o la primera ejecución del programa, entonces el punto de entrada y _start no son relevantes, ya que usa el archivo elf como un trampolín para una herramienta que programa el flash (como openocd over jtag) oa través de cualquier objcopy -O binary file.elf file.bin y luego ese archivo se carga de alguna manera en la memoria flash. No fui y probé un cargador de arranque en x86, pero supongo que la BIOS no puede analizar los archivos elf, por lo que también debería ser una imagen de memoria. así que un archivo bin de tipo binario -O
old_timer
1
la entidad separada es el hardware / lógica u otro diseño. para los sistemas operativos, el sistema operativo establece las reglas, para un microcontrolador, el diseño del chip / procesador establece las reglas. por ejemplo, si hay una tabla de vectores y luego los vectores apuntan a los manejadores, debe colocar todo eso en su script de enlazador, etc. para que los datos cargables estén destinados al flash desde el que arranca la cosa.
old_timer
1
Para ampliar que su objetivo tiene reglas, ya sea un sistema operativo o un procesador o un cargador de arranque de múltiples etapas, etc. Y necesita construir su "binario" basado en esas reglas, siendo el arranque y el script de enlace los más importantes. Entonces es muy amplio en cuanto a cada objetivo y cómo aplica ese binario y qué formatos de archivo son compatibles. Suponiendo que gnu en varias plataformas de desarrollo de host, el formato de archivo elf es la salida predeterminada y luego usa las herramientas según sea necesario (si el objetivo es utilidades / cargadores específicos) para extraer o convertir de elf a otra cosa.
El formato ELF es generalmente la salida predeterminada de la compilación. si usa cadenas de herramientas GNU, puede traducirlo a formato binario usando objcopy, como:
Esto se agregó después de que se respondiera el detalle del archivo bin, y se agrega como una técnica prácticamente útil. +1 por eso.
erbdex
-1
Solo quiero corregir un punto aquí. El archivo ELF lo genera el vinculador, no el compilador.
La misión del compilador finaliza después de producir los archivos objeto (* .o) a partir de los archivos de código fuente. El vinculador vincula todos los archivos .o y genera el ELF.
Votado en contra porque no responde la pregunta ni es necesariamente correcto. En términos generales, la compilación incluye enlaces. Citado de la lddocumentación : Por lo general, el último paso para compilar un programa es ejecutar ld.
NOP
sin-f
(o-fbin
), se compila en un solo byte0x90
, en lugar de un contenedor ELF de 400 bytes con-felf32
. Así que solo el código sin formato, no los metadatos del contenedor. NASM dice que se usa principalmente para archivos .COM y .SYS de MS-DOS .section
Las directivas se ignoran en su mayoría y solo generan alineación.Respuestas:
Un archivo Bin es un archivo binario puro sin reparaciones o reubicaciones de memoria, lo más probable es que tenga instrucciones explícitas para cargarse en una dirección de memoria específica. Mientras....
Los archivos ELF tienen un formato ejecutable enlazable que consiste en búsquedas de símbolos y una tabla reubicable, es decir, el kernel puede cargarlos en cualquier dirección de memoria y, automáticamente, todos los símbolos utilizados se ajustan al desplazamiento desde esa dirección de memoria donde fue cargado en. Por lo general, los archivos ELF tienen varias secciones, como 'datos', 'texto', 'bss', por nombrar solo algunas ... es dentro de esas secciones donde el tiempo de ejecución puede calcular dónde ajustar las referencias de memoria del símbolo dinámicamente en tiempo de ejecución.
fuente
Un archivo bin son solo los bits y bytes que van a la rom o una dirección particular desde la que ejecutará el programa. Puede tomar estos datos y cargarlos directamente tal como están, aunque necesita saber cuál es la dirección base, ya que normalmente no está allí.
Un archivo elf contiene la información del contenedor, pero está rodeado de mucha otra información, información de depuración posible, símbolos que pueden distinguir el código de los datos dentro del binario. Permite más de un fragmento de datos binarios (cuando vuelca uno de estos en un contenedor, obtiene un archivo de contenedor grande con datos de relleno para rellenarlo en el siguiente bloque). Le dice cuánto binario tiene y cuántos datos bss hay que desea inicializar a ceros (las herramientas gnu tienen problemas para crear archivos bin correctamente).
El formato de archivo elf es estándar, arm publica sus mejoras / variaciones en el estándar. Recomiendo a todos que escriban un programa de análisis elf para comprender lo que hay allí, no se molesten con una biblioteca, es bastante simple usar la información y las estructuras en la especificación. Ayuda a superar los problemas de GNU en general al crear archivos .bin, así como a depurar scripts del enlazador y otras cosas que pueden ayudar a estropear la salida de bin o elf.
fuente
algunos recursos:
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
http://en.wikipedia.org/wiki/Executable_and_Linkable_Format
El formato ELF es generalmente la salida predeterminada de la compilación. si usa cadenas de herramientas GNU, puede traducirlo a formato binario usando objcopy, como:
o usando la utilidad fromELF (aunque integrada en la mayoría de los IDE como ADS):
fuente
Solo quiero corregir un punto aquí. El archivo ELF lo genera el vinculador, no el compilador.
La misión del compilador finaliza después de producir los archivos objeto (* .o) a partir de los archivos de código fuente. El vinculador vincula todos los archivos .o y genera el ELF.
fuente
ld
documentación : Por lo general, el último paso para compilar un programa es ejecutar ld.