GNU linker: не считать раздел как bss - PullRequest
0 голосов
/ 01 марта 2020

Рассмотрим следующий скрипт компоновщика, который я написал для микроконтроллера на основе ARM:

/* Configure memory regions */
MEMORY
{
  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 128K
  BKPRAM (rw) : ORIGIN = 0x40024000, LENGTH = 4K
  CCMRAM (rwx) : ORIGIN = 0x1000000, LENGTH = 64K
}

SECTIONS
{
  .text :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector*))
    *(.text*)          /* .text* sections (code) */
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } > RAM

  .ARM.extab :
  {
    *(.ARM.extab* .gnu.linkonce.armextab.*)
  } > RAM

  .ARM.exidx :
  {
    __exidx_start = .;
    *(.ARM.exidx* .gnu.linkonce.armexidx.*)
    __exidx_end = .;
  } > RAM

  __etext = .;

  .data : AT (__etext)
  {
    . = ALIGN(4);
    __data_start__ = .;
    *(.data*)
    . = ALIGN(4);
    __data_end__ = .;
  } > RAM

  .bss :
  {
    . = ALIGN(4);
    __bss_start__ = .;
    *(.bss*)
    *(COMMON)
    . = ALIGN(4);
    __bss_end__ = .;
  } > RAM

  .heap_dummy :
  {
    . = ALIGN(4);
    __end__ = .;
    end = __end__;
    . = . + __HEAP_SIZE;
    . = ALIGN(4);
    __HeapLimit = .;
  } > RAM

  .stack_dummy :
  {
    . = ALIGN(4);
    . = . + __STACK_SIZE;
    __StackTop = .;
    . = ALIGN(4);
  } > RAM
}

Кажется, что он работает нормально и, по крайней мере, в соответствии с разборкой и файлом карты, он размещает все разделы как должно. Однако у него есть одна небольшая проблема: как можно видеть, я включил разделы «heap_dummy» и «stack_dummy», которые на самом деле не должны содержать данные, но я создал эти разделы так, что я получаю предупреждение, если либо Размер кучи или размер стека настраиваются так, чтобы они не помещались в ОЗУ. Это работает очень хорошо. Однако, когда я использовал размер стека 1024, инструмент arm-none-eabi-size сообщает следующее

test_ram.elf
   text    data     bss     dec     hex filename
    124       0    1024    1152     480 bin/test_ram.elf

, т. Е. Размер раздела «пустышка стека» считается таким, как если бы это был раздел bss. Однако я не хочу, чтобы компоновщик фактически подсчитывал размер двух фиктивных секций, поскольку они на самом деле не существуют, а используются только для резервирования некоторого пространства. Как я могу подавить это и при этом сохранить свои пустышки? Или, в качестве альтернативы, можно также как-то отслеживать использование памяти для стека и кучи без фиктивных разделов?

...