Me gustaría saber cuál es el propósito del archivo de dispersión ARM y el archivo MAP de direcciones de ARM Linker. ¿Cómo ayudan en la compilación y eventualmente durante la carga del ejecutable?
Para compilar desde código C a una imagen ejecutable que puede ejecutar en un microcontrolador ARM, hay dos pasos: compilar y vincular.
Durante la compilación, el código C finalmente se convertirá en código objeto, que no se puede utilizar por sí solo. En medio del proceso, es posible que pueda generar listados de ensamblaje intermedios para los archivos C.
Durante el enlace, todos los archivos de objetos se combinarán y las llamadas a funciones y las variables globales se vincularán. También decide en qué parte del espacio de memoria del objetivo terminará todo (código, datos de solo lectura, datos de lectura/escritura).
Así es como puede llamar a algo como printf
sin tener el código en su archivo. Cuando compila, no sabe nada printf
excepto el prototipo en stdio.h
. Cuando se vincula, el vinculador completará los detalles sobre dónde printf
vive realmente en la memoria.
El enlazador usa un archivo de dispersión para saber en qué parte del objetivo existen ciertas áreas de memoria. Por lo general, un microcontrolador asignará Flash interno a la dirección 0x00000000
. La SRAM interna existirá en alguna otra dirección, por ejemplo 0x20000000
, y la DRAM externa o Flash podría existir en otra dirección, 0x80000000
. El archivo de dispersión informará al enlazador de estas áreas y le indicará que coloque ciertas secciones de la salida en ciertas áreas. Por lo general, su código ejecutable vive en la text
sección, que normalmente se almacenaría en su flash interno. Sus datos de solo lectura vivirían en la sección llamada rodata
y también se almacenarían en flash. Los datos de lectura/escritura normalmente estarán en bss
(inicializados a cero) odata
(inicializado con valor), y esto se colocaría en la RAM, con los valores inicializados almacenados en otra sección en flash.
Estos nombres de sección son algo específicos de la cadena de herramientas, aunque suelen ser similares entre herramientas.
El archivo de mapa del enlazador es un archivo de salida que le indica después de vincular dónde terminaron todos sus símbolos. Por ejemplo, puede indicarle que main()
se ha ubicado 0x00000278
en Flash y que la variable global int x
se ha ubicado 0x20001012
en RAM. También le dirá dónde se han colocado las secciones generadas por el enlazador. Estos incluyen su pila C, potencialmente una pila de interrupción y también posiblemente un montón. El archivo de dispersión generalmente también le permite especificar el tamaño de estas secciones.
olin lathrop
DoxyLover
Abhijit K Rao