Gcc ld中内存段溢出的检测

Gcc ld中内存段溢出的检测,gcc,out-of-memory,ld,Gcc,Out Of Memory,Ld,我有一个使用GCC工具链的微控制器项目 gcc version 4.7.4 20130913 (release) [ARM/embedded-4_7-branch revision 202601] 控制器具有512k闪存。前64k由引导加载程序占用,448k用于项目。我定义了一个链接器脚本,大小为FLASH和RAM。我还添加了部分。以下是摘录: MEMORY { FLASH (rx) : ORIGIN = 0x00010000, LENGTH = 448K RAM (xrw)

我有一个使用GCC工具链的微控制器项目

gcc version 4.7.4 20130913 (release) [ARM/embedded-4_7-branch revision 202601]
控制器具有512k闪存。前64k由引导加载程序占用,448k用于项目。我定义了一个链接器脚本,大小为FLASH和RAM。我还添加了部分。以下是摘录:

MEMORY
{
  FLASH (rx)      : ORIGIN = 0x00010000, LENGTH = 448K
  RAM (xrw)       : ORIGIN = 0x10000000, LENGTH = 64K
}

SECTIONS
{
  .text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
  } > FLASH

  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
    _eflash = .;
  } >FLASH

  /* used by the startup to initialize data */
  _sidata = .;

  .data : AT ( _sidata )
  {
    *(.data)           /* .data sections */
    *(.data*)          /* .data* sections */
    _edata = .;        /* define a global symbol at data end */
  } >RAM
}
链接器可以很好地将所有部分放置在它们的位置。问题是链接器没有检查闪存中
\u sidata
位置的
.data
.data*
部分是否有足够的空间。结果输出超出内存大小而没有任何警告

如何调整链接器脚本,以便ld在计算大小时使用初始化数据(.data)


编辑:是否有任何命令行选项来强制合理的数据放置?

此链接器故障可通过断言显示:

  /* used by the startup to initialize data */
  _sidata = .;

  .data : AT ( _sidata )
  {
    _sdata = .;
    *(.data)           /* .data sections */
    *(.data*)          /* .data* sections */
    _edata = .;        /* define a global symbol at data end */
  } >RAM

  /* verify that the initialization data fits in FLASH */
  ASSERT(
     (_sidata + (_edata - _sdata)) <= (ORIGIN(FLASH) + LENGTH(FLASH)),
     "Initialization Data blow up")
}
/*用于启动初始化数据*/
_sidata=。;
.数据:AT(_sidata)
{
_sdata=。;
*(.数据)/*.数据部分*/
*(.data*)/*.data*节*/
_edata=.;/*在数据端定义一个全局符号*/
}>内存
/*验证初始化数据是否适合闪存*/
断言(
(_sidata+(_edata-_sdata))