代码之家  ›  专栏  ›  技术社区  ›  Claudio

newlib:如何在链接器脚本中指定堆大小

  •  0
  • Claudio  · 技术社区  · 8 年前

    我用的是AARCH64 裸机 基于NeLIB C库的LeRARO提供的工具链,我需要在链接器脚本中指定堆位置,以便能够使用具有动态内存的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库是否还有其他用于指定最大堆大小的符号。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Claudio    8 年前

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

    • Semihosting :堆和堆栈限制可以由以下返回值指定 SYS_HEAPINFO .
    • 非半宿主 _sbrk() 系统调用检查分配的内存是否将覆盖当前堆栈。但是,没有检查堆栈在增长时是否覆盖堆。因此,没有用于指定堆大小的newlib符号,因此在堆栈和堆内存区域之间强制进行强分区。
    推荐文章