Pregunta

Estoy escribiendo un guión de arranque para un dispositivo basado en ARM Cortex M3. Si puedo compilar el guión de arranque ensamblador y el código de aplicación C y luego combinar los archivos de objetos y transferirlos a mi todo lo que funciona el dispositivo.

Sin embargo, si uso ar para crear un archivo (libboot.a) y combinar ese archivo con la aplicación C hay un problema:

He puesto el código de arranque en una sección:

    .section    .boot, "ax"
    .global     _start

_start:
    .word       0x10000800  /* Initial stack pointer (FIXME!) */
    .word       start
    .word       nmi_handler
    .word       hard_fault_handler
    ... etc ...

He encontrado que ld tiras de esto desde el binario final (la sección de "arranque" no está disponible). Esto es muy natural ya que no hay dependencia de él que ld conoce, pero hace que el dispositivo no arranque correctamente.

Así que mi pregunta es: ¿cuál es la mejor manera de forzar el código para ser incluido

¿Fue útil?

Solución

Trate de añadir algo como:

KEEP(*(.boot))

en el guión ld enlazador para decirle al enlazador para mantener la sección .boot.

Sin embargo, no estoy seguro si esto es suficiente para causar ld para tirar en los objetos del archivo que se encuentran en la sección .boot - que podría no considerar un objeto en absoluto a menos algún símbolo en ese objeto está haciendo que se ser tirado. Si esto es un problema, especificando _start como el punto de entrada (usando -e _start en la línea de comando ld o usando ENTRY(_start) en el guión enlazador) puede ser la solución.

Otros consejos

creo que desea pasar el - no-GC-secciones al enlazador. Desde el GNU ld documentación :

--gc-sections
--no-gc-sections

Enable garbage collection of unused input sections.

`--gc-sections' decides which input sections are used
by examining symbols and relocations. The section
containing the entry symbol and all sections containing symbols
undefined on the command-line will be kept, as will sections
containing symbols referenced by dynamic objects.
Note that when building shared libraries, the linker must
assume that any visible symbol is referenced. Once this initial
set of sections has been determined, the linker recursively marks
as used any section referenced by their relocations.
See `--entry' and `--undefined'.

El enlazador solamente va a extraer de un archivo esos objetos necesarios para resolver los símbolos que se hace referencia de forma explícita. Su código de puesta en marcha no se hace referencia explícita porque se invoca a través del vector de reset.

Si su código de arranque comprende múltiples módulos se debe crear un parcialmente ligados archivo de objeto usando LD y la - r / opción --relocatable, esto será combinar los objetos en un solo objeto, sin la necesidad de resolver todos los símbolos (como principal ( ) por ejemplo). Esto puede ser usado en un enlace completo con el código de aplicación. Si se trata de un único fichero objeto entonces no hay ninguna ventaja real en la creación de un archivo en cualquier caso (y como lo ha encontrado no funcionará).

Tenga en cuenta que tradicionalmente GNU C en tiempo de ejecución se proporciona en un archivo llamado crt0.o (no un archivo) puesta en marcha, presumiblemente por la misma razón.

Se podría utilizar --whole-archive al vincular pero es un arma de gran elefante. La página del manual reclamaciones:

  

Para cada archivo mencionado en la línea de comandos después de la opción --whole-archive, incluye todos los archivos objeto en el archivo en el enlace, en lugar de buscar el archivo de los archivos objeto requerido.

Se podría utilizar la opción ld --whole-archivo para tirar de símbolos sin referencia. Este opciones ld página tiene esto para todo el archivo --whole-Archivo

  

Para cada archivo mencionado en el   línea de comandos después de la --whole-archivo   opción, incluye todos los archivos objeto en   el archivo en el enlace, en lugar de   buscar en el Archivo de la necesaria   ficheros objeto. Esto se usa normalmente para   convertir un archivo de almacenamiento en una compartida   biblioteca, obligando a cada objeto sea   incluido en el compartida resultante   biblioteca. Esta opción se puede usar más   de una vez.
      Dos notas cuando se utiliza esta opción de gcc: En primer lugar, gcc no conoce   sobre esta opción, por lo que tiene a su uso   -Wl, -whole-archivo. En segundo lugar, no se olvide de utilizar -Wl, -no-toda-archivo   después de que su lista de archivos, porque   gcc agregará su propia lista de archivos   a su enlace y puede que no quiera este   bandera para afectar esos también.

También ver esta pregunta en desbordamiento de pila, de opción de todo el archivo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top