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
的使用。