Propósito de los archivos ARM Linker

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?

¿Entiende qué es un enlazador en general, qué hace por usted y por qué desea utilizar uno?
El archivo MAP es solo para referencia del usuario: solo se genera desde el enlazador y no lo utiliza ningún componente de software estándar.
@Olin: El enlazador enlaza varios módulos de programa para que no queden referencias sin resolver.

Respuestas (1)

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 printfsin tener el código en su archivo. Cuando compila, no sabe nada printfexcepto el prototipo en stdio.h. Cuando se vincula, el vinculador completará los detalles sobre dónde printfvive 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 textsección, que normalmente se almacenaría en su flash interno. Sus datos de solo lectura vivirían en la sección llamada rodatay 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 0x00000278en Flash y que la variable global int xse ha ubicado 0x20001012en 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.

¡Gran explicación! ¿Puedo preguntar si el script del enlazador es lo mismo que los archivos dispersos?
"Archivo de dispersión" parece ser un término más genérico para cualquier archivo que mapea la memoria y dónde deben ir las cosas. Consideraría que un archivo de secuencia de comandos del enlazador es un tipo específico de archivo de dispersión que indica dónde deben ir las secciones del enlazador. Aunque esto es subjetivo.