Propósito de los archivos ARM Linker

2

Me gustaría saber cuál es el propósito del archivo de dispersión ARM y del archivo MAP de la dirección del vinculador ARM. ¿Cómo ayudan en la compilación y, finalmente, durante la carga del ejecutable?

    
pregunta Abhijit K Rao

1 respuesta

4

Para compilar desde el 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 la mitad del proceso, es posible que pueda generar listas de ensamblajes intermedios para los archivos C

.

Durante el enlace, los archivos de objetos se combinarán todos juntos y se vincularán las funciones y las variables globales. También decide dónde terminará todo en el espacio de memoria del objetivo (código, datos de solo lectura, datos de lectura / escritura).

Así es como puedes llamar a algo como printf sin tener el código en tu archivo. Cuando compilas, no sabe nada acerca de printf excepto por el prototipo en stdio.h . Cuando esté vinculado, el enlazador completará los detalles sobre dónde printf realmente vive en la memoria.

El enlazador utiliza un archivo de dispersión para saber dónde existen ciertas áreas de memoria en el destino. Normalmente, un microcontrolador asignará Flash interno a la dirección 0x00000000 . La SRAM interna existirá en alguna otra dirección, digamos 0x20000000 , y la DRAM externa o Flash podría existir en otra dirección, 0x80000000 . El archivo de dispersión informará al vinculador de estas áreas y le indicará que coloque ciertas secciones de la salida en ciertas áreas. Normalmente, su código ejecutable se encuentra en la sección text , 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án en flash. Los datos de lectura / escritura normalmente estarán en bss (inicializado a cero) o data (inicializado con valor), y esto se colocará en la RAM, con los valores inicializados almacenados en otra sección en flash.

Los nombres de estas secciones son algo específicos de las cadenas de herramientas, aunque generalmente son similares en todas las herramientas.

El archivo de mapa del vinculador es un archivo de salida que le indica después de vincular dónde han terminado todos sus símbolos. Por ejemplo, puede decirle que main() se ha localizado en 0x00000278 en Flash, y que la variable global int x se ha ubicado en 0x20001012 en la RAM. También le dirá dónde se han colocado las secciones generadas por el enlazador. Estos incluyen su pila de C, potencialmente una pila de interrupción, y posiblemente también un montón. El archivo de dispersión generalmente también le permite especificar el tamaño de estas secciones.

    
respondido por el rjp

Lea otras preguntas en las etiquetas