Рассмотрим следующий скрипт компоновщика, который я написал для микроконтроллера на основе 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. Однако я не хочу, чтобы компоновщик фактически подсчитывал размер двух фиктивных секций, поскольку они на самом деле не существуют, а используются только для резервирования некоторого пространства. Как я могу подавить это и при этом сохранить свои пустышки? Или, в качестве альтернативы, можно также как-то отслеживать использование памяти для стека и кучи без фиктивных разделов?