Newlib:如何在链接描述文件中指定堆大小
Newlib: how to specify the heap size in the linker script
我使用的是Linaro提供的aarch64 bare-metal工具链,基于newlib C库,需要在linker script中指定heap位置能够使用具有动态内存的 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: heap and stack limits can be specified by the return values of
SYS_HEAPINFO
.
- 非半主机:
_sbrk()
系统调用检查分配的内存是否将覆盖当前堆栈。但是,没有检查堆栈在增长时是否会覆盖堆。因此,没有用于指定堆大小的 newlib 符号,从而在堆栈和堆内存区域之间强加了一个强分区。
我使用的是Linaro提供的aarch64 bare-metal工具链,基于newlib C库,需要在linker script中指定heap位置能够使用具有动态内存的 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: heap and stack limits can be specified by the return values of
SYS_HEAPINFO
. - 非半主机:
_sbrk()
系统调用检查分配的内存是否将覆盖当前堆栈。但是,没有检查堆栈在增长时是否会覆盖堆。因此,没有用于指定堆大小的 newlib 符号,从而在堆栈和堆内存区域之间强加了一个强分区。