提问人:Youssef Boukadida 提问时间:11/12/2023 更新时间:11/12/2023 访问量:30
在带有 GCC 的 STM32 项目中对 _estack 和 _Min_Stack_Size 的未定义引用
Undefined reference to _estack and _Min_Stack_Size in STM32 project with GCC
问:
我在使用 GCC 构建 STM32 项目时遇到了一个问题。错误消息如下:
gcc -o Src/syscalls.o -c Src/syscalls.c
gcc -o main src/main.o src/syscalls.o src/sysmem.o src/uart.o
/usr/bin/ld: src/sysmem.o: attention: réadressage sur « _estack » dans la section en lecture seule « .text »
/usr/bin/ld: Src/sysmem.o : dans la fonction « _sbrk » :
sysmem.c:(.text+0xf):对 _Min_Stack_Size' 的未定义引用
/usr/bin/ld: attention: création de DT_TEXTREL dans un PIE
collect2:错误:ld 返回 1 退出状态
make: *** [Makefile:13 : main] 错误 1_estack' /usr/bin/ld: sysmem.c:(.text+0x18): undefined reference to
我在编译 STM32 项目时遇到链接器错误。它似乎与文件 sysmem.c 中的符号 _estack 和 _Min_Stack_Size有关。链接器找不到这些引用,从而导致生成失败。
对_estack的未定义引用:链接器在_sbrk函数期间处理文件 sysmem.c 时,报告对 .text 部分中_estack的符号的未定义引用。
对_Min_Stack_Size的未定义引用:此外,对同一文件中_Min_Stack_Size的符号有一个未定义的引用。
我正在寻求有关如何解决这些链接器错误并成功构建我的 STM32 项目的指导。如果能提供任何帮助或了解可能导致这些问题的原因,我们将不胜感激。
- Project 使用 GCC 作为编译器。
- 正在使用STM32微控制器。
- 完整的 Makefile 可供参考。
答:
这些符号通常在 **linker script“* 中定义。你可能没有,或者你写了一个无效的。
它是链接器脚本(定义这些符号)的示例开头:
/* Entry Point */
ENTRY(Reset_Handler)
/* Highest address of the user mode stack */
_estack = ORIGIN(RAM_START) + 96K; /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */
当然是内存区域定义,是定义程序入口点的源文件之一的符号。RAM_START
Reset_Handler
我强烈建议,如果你对工具链和目标硬件没有非常深入的了解,不要尝试编写 DIY makefile。坚持使用STM32CubeIDE,它将为您生成这些。
评论