2010-04-21 16 views
7

Estoy escribiendo un script de arranque para un dispositivo basado en ARM-Cortex M3. Si compilo el script de arranque del ensamblador y el código de la aplicación C, y luego combino los archivos del objeto y los transfiero a mi dispositivo, todo funciona.GNU ld quita la sección

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 lo quita del binario final (la sección "arranque" no está disponible). Esto es bastante natural ya que no existe una dependencia de él que ld conoce, pero hace que el dispositivo no se inicie correctamente.

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

Respuesta

10

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 de si esto es suficiente para provocar que ld extraiga cualquier objeto del archivo que esté en la sección .boot; podría no considerar un objeto a menos que algún símbolo en ese objeto lo esté causando para ser arrastrado. Si esto es un problema, especificar _start como punto de entrada (usando -e _start en la línea de comando ld o usando ENTRY(_start) en el script del enlazador) puede ser la solución.

3

Creo que desea pasar el --no-GC-secciones opción para el enlazador. Desde el GNU ld documentation:

--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'. 
2

El enlazador sólo se va a extraer de un archivo los objetos necesarios para resolver los símbolos que se hace referencia de forma explícita. Su código de inicio no se referencia explícitamente porque se invoca a través del vector de reinicio.

Si el código de arranque comprende múltiples módulos se debe crear un fichero objeto parcialmente vinculado mediante ld y la opción -r/--relocatable, esto va a combinar los objetos en un único objeto, sin la necesidad de resolver todos los símbolos (como main() por ejemplo). Esto se puede usar en un enlace completo con el código de su aplicación. Si solo se trata de un único archivo de objeto, en cualquier caso no existe ninguna ventaja real al crear un archivo (y, como ha comprobado, no funcionará).

Tenga en cuenta que tradicionalmente el inicio de ejecución de GNU C se proporciona en un archivo llamado crt0.o (no un archivo) presumiblemente por el mismo motivo.

1

Puede usar la opción ld --whole-archive para extraer símbolos sin referencia. Este ld options page tiene esto para todo el archivo de archivado y --whole

Para cada archivo mencionado en la línea de comandos después de la --whole-archivo opción, incluyen todos los archivos objeto en el archivo en el enlace , en lugar de buscando en el archivo los archivos de objeto requeridos. Esto normalmente se usa para convertir un archivo en una biblioteca compartida , forzando que cada objeto sea incluido en la biblioteca compartida resultante. Esta opción se puede usar más que una vez.
Dos notas al usar esta opción de gcc: En primer lugar, gcc no conoce acerca de esta opción, por lo que debe usar -Wl, -whole-archive. En segundo lugar, no olvides utilizar -Wl, -no-whole-archive después de tu lista de archivos, porque gcc agregará su propia lista de archivos a tu enlace y es posible que no quieras que esta bandera los afecte como bien.

Véase también esta pregunta en desbordamiento de pila, uses of whole-archive option

2

Puedes usar --whole-archive al enlazar pero es una gran arma de elefante. Las reivindicaciones página del manual:

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

Cuestiones relacionadas