Linker 在闪存更改ELF基址之前添加空载部分

Linker 在闪存更改ELF基址之前添加空载部分,linker,microcontroller,elf,linker-scripts,flash-memory,Linker,Microcontroller,Elf,Linker Scripts,Flash Memory,因此,我试图在引导加载程序和主代码之间的某个地址添加闪存的保留部分,该地址位于闪存的自己扇区中(我使用的是STM32F4)。当我在代码中使用该部分时,elf基址会发生变化,我的调试器会崩溃,但是十六进制(显然)可以工作。在我的调试器中打开elf时,它会查找错误的基址0x8000000。由于FLASH位于0x800C000(isr_向量加载在那里),调试器无法启动代码 那么,我的问题是,为什么添加这个部分会导致elf重新设置地址的基址?我使用另一个代码库,其中这是由另一个人为STM32F0实现的(

因此,我试图在引导加载程序和主代码之间的某个地址添加闪存的保留部分,该地址位于闪存的自己扇区中(我使用的是STM32F4)。当我在代码中使用该部分时,elf基址会发生变化,我的调试器会崩溃,但是十六进制(显然)可以工作。在我的调试器中打开elf时,它会查找错误的基址0x8000000。由于FLASH位于0x800C000(isr_向量加载在那里),调试器无法启动代码

那么,我的问题是,为什么添加这个部分会导致elf重新设置地址的基址?我使用另一个代码库,其中这是由另一个人为STM32F0实现的(以相同的方式),没有这个问题。我认为NOLOAD标签应该告诉编译器不要加载flash部分,因此它不会影响elf程序头

下面是我如何设置的示例:

代码
const myStruct var_uuuuu属性_uuu((.rsv_flash)部分),已使用,已对齐(4);
连接器
您可能会发现将内存区域按顺序排列并使其连续是很有帮助的,即:设置RSV_FLASH LENGTH=16K。此外,“freaks out”显然是胡说八道。请编辑您的帖子,以包含它给您的确切消息,并使您的帖子包含一个问题。@TomV谢谢您的建议,我已经填写了一些详细信息:)stm32s应用程序闪存为0x08000000或0x00200000,在某些罕见的情况下作为替代品而不是替代品,这是哪种特定的stm32?大多数情况下,如果没有0x08000000,则不会启动(我们将启动无芯片引导加载程序)。@old_timer我知道应用程序闪存在0x8000000启动,elf保存十六进制的基址,我的调试器查找该基址并适当地设置SP和PC。我的问题是,我添加了空载部分,这将ELF基址更改为应用程序闪存的开始,而不是我的链接器指定的程序闪存的开始
MEMORY
{
FLASH (rx): ORIGIN=0x800C000 LENGTH= 2M - 32K - 16K
RSV_FLASH (r): ORIGIN=0x8008000 LENGTH= 64
}

SECTIONS {
/* There are other Sections in here */

.rsv_flash (NOLOAD) :
{
 __RSV_FLASH_START=.;
. = ALIGN(4);
KEEP(*(.rsv_flash))
. = ALIGN(4);
 __RSV_FLASH_END=.;
} >RSV_FLASH