检测ld中内存段溢出问题

4

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

gcc version 4.7.4 20130913 (release) [ARM/embedded-4_7-branch revision 202601]

这个控制器有512k的闪存。其中前64k被引导程序占用,剩下的448k用于项目。我定义了一个链接脚本来设置闪存和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
}

链接器可以很好地将所有节放置在其位置,但问题在于链接器不会检查FLASH中位于_sidata位置上的.data和.data*节是否有足够的空间。最终输出超出内存大小(没有任何警告)
我该如何修改链接脚本以便ld在大小计算中使用初始化数据(.data)呢?
编辑:是否有任何命令行选项可以强制合理的数据放置?
1个回答

3

这个链接器故障可以通过ASSERT语句暴露出来:

  /* 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")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接