gcc - Newlib:如何在链接器脚本中指定堆大小

标签 gcc heap-memory bare-metal linker-scripts newlib

我使用的是 Linaro 提供的 aarch64 bare-metal 工具链,基于 newlib C 库,我需要在链接器脚本中指定堆位置以便能够使用具有动态内存的 C++ STL 数据结构(例如 std::vector)。

按照示例here ,我定义了 end 符号,如下所示。

.data   : {
  *(.data)
}

. = ALIGN(8);
/* "end" is used by newlib's syscalls! */
PROVIDE(end = .);

. = ALIGN(16);
stack_bottom = .;
. = ALIGN(4096);
. = . + 0x10000;
stack_top = .;

但是,这样就无法检查堆是否已达到最大值(之后我们会出现堆栈损坏)。

因此,我想知道裸机 newlib 库是否有一些用于指定最大堆大小的进一步符号。

最佳答案

newlib mailing list 中所述,有两种情况:

  • Semihosting :堆和堆栈限制可以通过 SYS_HEAPINFO 的返回值指定.
  • 非半主机:_sbrk()系统调用检查分配的内存是否将覆盖当前堆栈。但是,没有检查堆栈在增长时是否会覆盖堆。因此,没有 newlib 符号来指定堆大小,从而在堆栈和堆内存区域之间强加了严格的分区。

关于gcc - Newlib:如何在链接器脚本中指定堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51743715/

相关文章:

javascript - JavaScript 对象的键是否存储在内存中?

c - 裸机 ARM Raspberry Pi + qemu 具有浮点除法的奇怪行为

c++ - g++和gcc有什么区别?

C for循环段错误

python - 构建时选择 GCC 版本 ( setup.py )

c++ - 与裸机目标的 cmake 项目链接错误

arm - 无中断嵌入式编程

c - 只读共享内存段错误

java.lang.OutOfMemory错误: Java heap space in allocating array size

c++ - Protocol Buffer 在解析时是否重用字符串指针?