在 FLASH 更改 ELF 基址之前添加 NOLOAD 部分

问题描述

因此,我尝试在引导加载程序和位于其自己扇区的主代码间的地址处添加闪存的保留部分(我使用的是 STM32F4)。当我在代码中使用该部分时,elf 基地址发生变化并且我的调试器吓坏了,但是十六进制(显然)有效。在我的调试器中打开 elf 时,它会查找错误的基地址 0x8000000。由于 FLASH 位于 0x800C000(并且 isr_vector 加载在那里),调试器无法启动代码

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

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

代码

const myStruct var __attribute__((section(".rsv_flash"),used,aligned(4));

链接

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)