es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Fallo de enlace de LLD (esperado, pero obtenido) en KEEP(*.init_array)

Estoy tratando de construir firmware para Cortex-M0 con clang. La compilación con gcc funciona bien, por supuesto. La compilación falla durante el enlace.

ld.lld: error: baremetal.ld:72: ( esperado, pero obtuvo )

>> KEEP(*.init_array)
>> ^
clang-12: error: el comando ld.lld falló con el código de salida 1 (use -v para ver la invocación)

El script de enlace es bastante estándar (y la línea ofensiva también está en los scripts proporcionados por CMSIS). La parte relevante es la siguiente:
“`
.rodata : ALIGN(4)
{
(.rodata .rodata. .gnu.linkonce.r.*)

. = ALIGN(4);
KEEP(*(.init))

. = ALIGN(4);
__preinit_array_start = . ;
KEEP(*(.preinit_array))
__preinit_array_end = . ;

. = ALIGN(4);
__init_array_start = . ;
KEEP(*(SORT(.init_array.*)))
KEEP(*.init_array)                <<======== error here
__init_array_end = . ;

. = ALIGN(4);
KEEP(*(.fini))

. = ALIGN(4);
__fini_array_start = . ;
KEEP(*(.fini_array))
KEEP(*(SORT(.fini_array.*)))
__fini_array_end = . ;

. = ALIGN(4);
KEEP (*crtbegin.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*crtend.o(.ctors))

. = ALIGN(0x4);
KEEP (*crtbegin.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*crtend.o(.dtors))

*(.init .init.*)
*(.fini .fini.*)

PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
PROVIDE_HIDDEN (__fini_array_end = .);

. = ALIGN (8);
*(.rom)
*(.rom.b)

_etext = . ;
_sidata = _etext;    /* first address of initialized data in FLASH */

} >FLASH

Mi versión de LLD es

$ ld.lld -V
LLD 13.0.0 (compatible with GNU linkers)

¿Cómo puedo solucionar el problema del enlace?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el error está relacionado con la sintaxis del script del enlazador. La línea KEEP(*.init_array) debe cambiarse a KEEP(*(.init_array)). Esto debería solucionar el problema.

Comments are closed.