0

我正在尝试使用 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)

如何修复链接?

4

1 回答 1

1

此链接描述文件无效。错误消息准确地告诉你你错了什么:“expected (”.

规格是filename(section)KEEP(filename(section))

你不能写:KEEP(*.init_array)因为文件名和节名之间没有“(”。

如果您的意思是“从任何文件中保留 .init_array 部分”,那么您需要:

KEEP(*(.init_array))

如果这个脚本确实是在 CMSIS 的发布版本中提供的(而且您自己没有打错字),那么您应该将其报告为错误。

于 2021-11-19T13:31:20.377 回答