使用 GCC 的 STM32 项目中对 _estack 和 _Min_Stack_Size 的未定义引用

问题描述 投票:0回答:1

我在使用 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: 注意: réadressage sur « _estack » dans lasection en Lecture « .text » /usr/bin/ld: Src/sysmem.o : 功能 « _sbrk » : sysmem.c:(.text+0xf): 对

_estack' /usr/bin/ld: sysmem.c:(.text+0x18): undefined reference to 
_Min_Stack_Size' 的未定义引用 /usr/bin/ld: 注意:在 PIE 上创建 DT_TEXTREL collect2:错误:ld 返回 1 退出状态 make: *** [Makefile:13 : main] 错误 1

我在编译 STM32 项目期间遇到链接器错误。它似乎与文件 sysmem.c 中的符号 _estack 和 _Min_Stack_Size 有关。链接器无法找到这些引用,导致构建失败。

对 _estack 的未定义引用:在 _sbrk 函数期间处理文件 sysmem.c 时,链接器报告对 .text 部分中的符号 _estack 的未定义引用。

对 _Min_Stack_Size 的未定义引用:此外,同一文件中还有对符号 _Min_Stack_Size 的未定义引用。

我正在寻求有关如何解决这些链接器错误并成功构建我的 STM32 项目的指导。任何有关可能导致这些问题的原因的帮助或见解将不胜感激。

  • 项目使用GCC作为编译器。
  • 正在使用STM32微控制器。
  • 完整的Makefile可供参考。
gcc makefile stm32
1个回答
0
投票

这些符号通常在 **链接器脚本“* 中定义。您可能没有,或者您编写了一个无效的符号。

这是链接描述文件开头的示例:

/* 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
是来自定义程序入口点的源文件之一的符号。

© www.soinside.com 2019 - 2024. All rights reserved.