【问题标题】:Newlib: how to specify the heap size in the linker scriptNewlib:如何在链接描述文件中指定堆大小
【发布时间】:2019-01-15 13:02:34
【问题描述】:

我使用的是 Linaro 提供的基于 newlib C 库的 aarch64 bare-metal 工具链,我需要在链接器脚本中指定堆位置才能使用具有动态内存的 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 库是否有其他符号来指定最大堆大小。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • this 文章也可用于计算当前堆/堆栈大小。可用于基于 newlib 的 libc 的代码在最后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2018-11-09
    • 2018-12-21
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多