LLD link 在 KEEP(*.init_array) 处失败(预期,但得到)
LLD link failure ( expected, but got ) at KEEP(*.init_array)
我正在尝试使用 clang 为 Cortex-M0 构建固件。 gcc 构建当然可以正常工作。链接期间构建失败
ld.lld: error: baremetal.ld:72: ( expected, but got )
>>> KEEP(*.init_array)
>>> ^
clang-12: error: ld.lld command failed with exit code 1 (use -v to see invocation)
链接器脚本非常标准(并且有问题的行也在 CMSIS 提供的脚本中)。相关部分:
.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
我的 LLD 版本
$ ld.lld -V
LLD 13.0.0 (compatible with GNU linkers)
如何修复链接?
此链接描述文件无效。错误消息准确地告诉您出了什么问题:"expected (".
规格为filename(section)
或KEEP(filename(section))
。
您不能写:KEEP(*.init_array)
因为文件名和节名之间没有“(”。
如果您的意思是“保留任何文件中的 .init_array 部分”,那么您需要:
KEEP(*(.init_array))
如果此脚本确实是随 CMSIS 的发布版本一起提供的(并且您没有自己打错字),那么您应该将其报告为错误。
我正在尝试使用 clang 为 Cortex-M0 构建固件。 gcc 构建当然可以正常工作。链接期间构建失败
ld.lld: error: baremetal.ld:72: ( expected, but got )
>>> KEEP(*.init_array)
>>> ^
clang-12: error: ld.lld command failed with exit code 1 (use -v to see invocation)
链接器脚本非常标准(并且有问题的行也在 CMSIS 提供的脚本中)。相关部分:
.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
我的 LLD 版本
$ ld.lld -V
LLD 13.0.0 (compatible with GNU linkers)
如何修复链接?
此链接描述文件无效。错误消息准确地告诉您出了什么问题:"expected (".
规格为filename(section)
或KEEP(filename(section))
。
您不能写:KEEP(*.init_array)
因为文件名和节名之间没有“(”。
如果您的意思是“保留任何文件中的 .init_array 部分”,那么您需要:
KEEP(*(.init_array))
如果此脚本确实是随 CMSIS 的发布版本一起提供的(并且您没有自己打错字),那么您应该将其报告为错误。