链接器错误:"cannot move location counter backwards (from 200009f8 to 20000800)"

Linker error: "cannot move location counter backwards (from 200009f8 to 20000800)"

本文关键字:200009f8 from to 20000800 backwards location 错误 cannot 链接 move counter      更新时间:2023-10-16

我正在尝试使用 PlatformIO 固件 Mbed 为 Nucleo STM32F042k6 构建代码,但出现以下错误:

.piobuildnucleo_f042k6STM32F042X6.ld.link_script.ld:82 cannot move location counter backwards (from 200009f8 to 20000800)

谁能帮我?

该版本以前有效,但由于我在新计算机上安装了 PlatformIO,因此它不再有效。

STM32F042X6.ld.link_script.ld :

STACK_SIZE = 4096;
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 32k
RAM (xrw) : ORIGIN = 0x200000C0, LENGTH = 6k - 0x0C0
}
ENTRY(Reset_Handler)
SECTIONS
{
.text :
{
KEEP(*(.isr_vector))
*(.text*)
KEEP(*(.init))
KEEP(*(.fini))
*crtbegin.o(.ctors)
*crtbegin?.o(.ctors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
*(SORT(.ctors.*))
*(.ctors)
*crtbegin.o(.dtors)
*crtbegin?.o(.dtors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
*(SORT(.dtors.*))
*(.dtors)
*(.rodata*)
KEEP(*(.eh_frame*))
} > FLASH
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > FLASH
__exidx_start = .;
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > FLASH
__exidx_end = .;
__etext = .;
_sidata = .;
.data : AT (__etext)
{
__data_start__ = .;
_sdata = .;
*(vtable)
*(.data*)
. = ALIGN(8);
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP(*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(8);
PROVIDE_HIDDEN (__init_array_start = .);
KEEP(*(SORT(.init_array.*)))
KEEP(*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(8);
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP(*(SORT(.fini_array.*)))
KEEP(*(.fini_array))
PROVIDE_HIDDEN (__fini_array_end = .);
KEEP(*(.jcr*))
. = ALIGN(8);
__data_end__ = .;
_edata = .;
} > RAM
.bss :
{
. = ALIGN(8);
__bss_start__ = .;
_sbss = .;
*(.bss*)
*(COMMON)
. = ALIGN(8);
__bss_end__ = .;
_ebss = .;
} > RAM
.heap (COPY):
{
__end__ = .;
end = __end__;
*(.heap*)
. = ORIGIN(RAM) + LENGTH(RAM) - STACK_SIZE;
__HeapLimit = .;
} > RAM
.stack_dummy (COPY):
{
*(.stack*)
} > RAM
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
_estack = __StackTop;
__StackLimit = __StackTop - STACK_SIZE;
PROVIDE(__stack = __StackTop);
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
}

'

最近我在使用 silabs 芯片时遇到了同样的问题,只需调整您的堆大小/堆栈大小即可。你的问题应该得到解决。如果我没记错的话,这意味着您正在用完 RAM 来放置堆。

我知道已经是 2/3 年了哈哈,希望这对将来遇到这个问题的人有所帮助:)