GNU LD:重叠部分(NOLOAD)不会产生任何错误

时间:2018-07-03 11:20:21

标签: gnu ld overlapping

我有一个用例,我想在FLASH的末尾为用户数据保留Flash的可配置区域。如果代码段与“用户数据”区域重叠,则链接程序将不会产生错误(或至少发出警告)。 这是我在链接描述文件中定义的内容:

MEMORY
{
    RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 160K
    FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K
}

SECTIONS
{
    .text :
    {          
        *(.text)
        *(.text*)
        *(.glue_7)
        *(.glue_7t)
        *(.eh_frame)

        KEEP (*(.init))
        KEEP (*(.fini))
        _etext = .;
  } >FLASH

  /* Reserved FLASH area for user data (r/w data in Flash) */
  __flash_data_size__ = DEFINED(FLASH_DATA_SIZE) ? FLASH_DATA_SIZE : 0K;

  .flash_data  ORIGIN(FLASH) + LENGTH(FLASH) - __flash_data_size__ (NOLOAD) : 
  {
    . = ALIGN(2048);
    __flash_data_start__ = .;
    . = . + __flash_data_size__;
    __flash_data_end__ = .;
  } >FLASH
}

当我定义符号FLASH_DATA_SIZE时,我可以看到elf文件按预期在Flash的末尾包含一个NOLOAD节。但是,如果该部分与代码部分(.text)重叠,则不会出现任何链接器错误。 知道链接器为什么不抱怨吗?

或者有其他任何想法,我如何才能为用户数据保留Flash的“编译时”可配置部分,以防止代码部分重叠?

预先感谢, 托马斯

1 个答案:

答案 0 :(得分:0)

我设法找到了一个可行的解决方案,并提供了重叠部分所需要的错误。我通过创建另一个具有可配置大小的MEMORY区域来解决了该问题。对于那些对解决方案感兴趣的人,我在下面提供了它:

_FLASH_SIZE = 512K;
_FLASH_DATA_SIZE = (DEFINED(FLASH_DATA_SIZE) ? FLASH_DATA_SIZE : 0K);

MEMORY
{
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 160K
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = _FLASH_SIZE - _FLASH_DATA_SIZE
  FLASH_DATA (rw) : ORIGIN = 0x08000000 + _FLASH_SIZE - _FLASH_DATA_SIZE, LENGTH = _FLASH_DATA_SIZE
}

SECTIONS
{
  .text :
  {      
    *(.text)
    *(.text*)
    *(.glue_7)
    *(.glue_7t)
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    _etext = .;
  } >FLASH

  .flash_data (NOLOAD) : 
  {
    . = ALIGN(2048);
    __flash_data_start__ = .;
    . = . + _FLASH_DATA_SIZE;
    __flash_data_end__ = .;
  } >FLASH_DATA
}