Como posso fazer uma seção vazia com GNU ld?
-
28-10-2019 - |
Pergunta
Estou trabalhando em um chip cortex-m3.O espaço de pilha foi reservado no código-fonte com uma matriz não inicializada na seção bss.O script do vinculador que usei é o seguinte:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256k
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64k
}
SECTIONS {
.text : {
KEEP(*(.isr_vector))
*(.text*)
*(.rodata*)
__text_end = .;
} >FLASH
.data : {
__data_start = .;
*(.data*)
__data_end = .;
} >SRAM AT>FLASH
.bss : {
__bss_start = .;
*(.bss*)
__bss_end = .;
} >SRAM
}
Estou tentando alocar uma seção para a pilha no início da região SRAM para que eu possa detectar o estouro da pilha com falha de uso.
Eu adicionei uma seção chamada .stack:
SECTIONS {
.text : {
:
} >FLASH
.stack : {
__stack_size = 4k;
__stack_start = .;
. = . + __stack_size;
. = ALIGN(8); /* cortex-m3 uses full-descending stack aligned with 8 bytes */
__stack_end = .;
} >SRAM
.data : {
:
} >SRAM AT>FLASH
.bss : {
:
} >SRAM
}
A vinculação é feita sem nenhum erro ou aviso, mas o problema é que __stack_end não está na região SRAM, mas na região FLASH.
Sei que posso usar uma seção separada fornecida com __attribute __ ((section ("name"))), mas acho que seria melhor se eu pudesse lidar com isso no script do vinculador.
Como posso criar uma seção vazia na região SRAM?
Solução
Basta dividir a área de RAM em duas:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256k
SRAM_STACK (rwx) : ORIGIN = 0x20000000, LENGTH = 4k
SRAM (rwx) : ORIGIN = 0x20001000, LENGTH = 60k
}
SECTIONS {
.text : {
KEEP(*(.isr_vector))
*(.text*)
*(.rodata*)
__text_end = .;
} >FLASH
.data : {
__data_start = .;
*(.data*)
__data_end = .;
} >SRAM AT>FLASH
.bss : {
__bss_start = .;
*(.bss*)
__bss_end = .;
} >SRAM
.stack : {
__stack_size = 4k;
__stack_start = .;
. = . + __stack_size;
. = ALIGN(8); /* cortex-m3 uses full-descending stack aligned with 8 bytes */
__stack_end = .;
} >SRAM_STACK
}