¿Dónde se encuentra el archivo elf dentro de un microcontrolador?

ELF no se encuentra dentro de un microcontrolador. Solo el binario (BIN) se encuentra dentro del flash del microcontrolador. ELF es un formato para empacar binarios ejecutables. Por defecto, la mayoría de los compiladores generan ELF como salida.

El archivo ELF contendrá la información sobre el compilador, la arquitectura del procesador, la tabla de símbolos, etc. Por otro lado, los archivos BIN / HEX no tienen esta información.

Cuando considera el tamaño del programa, solo tiene que ver el tamaño del archivo BIN (segmento .text del archivo). El tamaño del segmento .text es el tamaño real del programa.

Se le puede llamar una estructura de datos, sus miembros texto, código, etc. se mencionan como .text , .code , etc., como en lenguaje C.

Puede usar 7-zip para abrir un archivo ELF.

Considere el siguiente caso, utilicé Arduino IDE para explicar sobre ELF …

Este es un boceto LED parpadeante que compilé. El ELF generado reside en la ruta

C: \ Users \ User \ AppData \ Local \ Temp \ build9168893087863740253.tmp

El tamaño del flash ATmega328P es de 32 KB / 32,768 bytes. El programa ocupará 1030 bytes en flash.

Abramos el archivo usando 7-Zip. Instale 7-Zip. Haga clic derecho en ELF y seleccione 7-zip -> Abrir archivo .

Puedes ver que el tamaño de .text es el tamaño del programa

Usando avr-readelf -a

Utilice readelf (una utilidad UNIX) para obtener información sobre el archivo elf.

Esto es en caso de ARM ELF

El archivo .elf no es el que ejecuta el controlador. Es .bin o .hex. Incluso si es un archivo .hex o .bin, el tamaño del archivo en la computadora no es lo que debe buscar. Debe ver cuál es el tamaño del programa, en bytes, con la ayuda de hexadecimal veiwer. La mayoría de los compiladores también muestran este tamaño en bytes.

La imagen muestra el número de bytes que requiere el programa (resaltado en amarillo) para ARM Cortex M3 LPC1768 compilado con ARMGCC.

La extensión de archivo ELF significa formato ejecutable y enlazable. No son solo los datos los que entran en la memoria de un microcontrolador. Tiene mucha más información.

Un archivo ELF contiene encabezados y datos. Existe el encabezado ELF, que le dice al programa que desea leer este archivo si es un archivo ELF válido. También contiene información sobre si es un archivo de formato de 32 bits o de 64 bits, para qué sistema operativo de destino está destinado, para qué arquitectura de microprocesador de destino está destinado. También contiene información sobre el programa y el encabezado de la sección.

Los encabezados de programa y sección contienen información sobre qué y cuántos datos del segmento de programa (código) y segmentos de datos (variables) se encuentran en el archivo ELF.

Simplemente hablando, el código compilado se encuentra en el área del programa, y ​​las variables se encuentran en las áreas de memoria de datos y bss del microprocesador.

El programador puede controlar dónde se colocan exactamente los datos manipulando el archivo enlazador.

Para comprender más, primero tenga en mente sus ideas sobre la compilación de código completo y el proceso de vinculación. Hay muchas utilidades disponibles con herramientas de compilación (gcc es la más fácilmente disponible) que le permiten generar datos de compilación intermedios que puede observar. Esa es una información muy interesante: ver cómo su código C se transforma en el código de la máquina.

Comience con un código simple c = a + b donde todas estas sean variables globales. Vea el resultado de la compilación, pidiéndole al compilador que genere todos los datos de compilación intermedios en archivos.

Como hacer esto…? Consulte el manual de su compilador. ¡Disfrutar!

Kalpak ha dado una buena visión general, por lo que no tiene sentido repetir. Aquí hay algunos enlaces que lo ayudarán a comprender esto más a fondo, y está bien, si uno no entiende esto al 100% en la primera lectura.

texto, datos y bss: código y tamaño de datos explicados

Posicionar código independiente (PIC) en bibliotecas compartidas

¿Las variables inicializadas en la sección .bss ocupan espacio en el archivo elf?