GNU LD: перекрывающиеся секции (NOLOAD) не генерируют ошибок - PullRequest
0 голосов
/ 03 июля 2018

У меня есть сценарий использования, в котором я хочу зарезервировать настраиваемую область 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 содержит раздел NOLOAD в конце Flash, как и ожидалось. Однако, если секция перекрывается с секцией кода (.text), я не получаю никакой ошибки компоновщика. Есть идеи, почему компоновщик не жалуется на это?

В качестве альтернативы, есть ли другие идеи о том, как можно настроить настраиваемый раздел «времени компиляции» Flash, зарезервированный для пользовательских данных, который проверяется на перекрытие разделов кода?

Спасибо заранее, Томас

1 Ответ

0 голосов
/ 03 июля 2018

Мне удалось найти решение, которое работает и предоставило необходимые мне ошибки с перекрывающимися секциями. Я решил это, создав еще одну область памяти с настраиваемым размером. Для тех, кто заинтересован в решении, я предоставил его ниже:

_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
}
...