> 技术文档 > error: ld returned 1 exit status(vscode for stm32)_collect2.exe: error: ld returned 1 exit status

error: ld returned 1 exit status(vscode for stm32)_collect2.exe: error: ld returned 1 exit status

在进行将cubemx生成的makefile导入vscode,使用EIDE(EIDE 是一个专为 VS Code 设计的嵌入式开发环境插件,全称为 Embedded IDE,用于开发单片机项目,支持多种微控制器,如 8051、STM8、STM32 以及其他 Cortex-M 和 RISC-V 系列),打开工程并进行编译的时候,发生了如下错误

105: non constant or forward reference address expression for section .ARM.extab
collect2.exe: error: ld returned 1 exit status

提示我.ld文件出现了错误

找到如图所示代码

 

  .init_array (READONLY) : /* The \"READONLY\" keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */

  {

    . = ALIGN(4);

    PROVIDE_HIDDEN (__init_array_start = .);

    KEEP (*(SORT(.init_array.*)))

    KEEP (*(.init_array*))

    PROVIDE_HIDDEN (__init_array_end = .);

    . = ALIGN(4);

  } >FLASH

注意到注释部分\"READONLY\"(只读)只能在gcc11即以上的编译器才能使用,这里我们有两种方法解决这个问题,第一种直接删除\"READONLY\",第二种是更新跟高级的编译器,这里我门采用第一种方法,直接将.ld文件中的五个\"READONLY\"全部删除,结果如下。

发现编译通过了,好耶!

小知识:

.ld 文件是链接脚本文件(Linker Script),主要用于指导链接器(如 ld)如何将编译生成的目标文件(.o 文件)组合成最终的可执行文件(如 .elf 文件),并指定程序在目标硬件上的内存布局。

1.链接脚本定义了目标硬件的内存布局,包括各个内存区域的起始地址和大小。

2.链接脚本通过 SECTIONS 命令指定代码和数据在内存中的放置位置。

text 段用于存储程序代码和只读数据,放置在 FLASH 区域。

data 段用于存储初始化的全局变量和静态变量,放置在 RAM 区域,但其初始值存储在 FLASH 区域。

bss 段用于存储未初始化的全局变量和静态变量,放置在 RAM 区域。

3.链接脚本可以定义一些特殊的符号,用于在代码中引用内存地址。

4.链接脚本可以通过定义特定的节(如 .isr_vector)来控制程序的启动和中断向量表的放置。

5.链接脚本可以通过调整节的顺序和大小,优化程序的内存使用。例如,可以将常量数据(如字符串)放在 .rodata 段中,以减少 RAM 的使用。