强制链接器将相同的代码放在2个部分中

我试图强制链接器(来自XC32的ld)将相同的可执行代码放在flash的两个不同部分.

应用程序使得代码可以作为独立应用程序运行,并且还可以通过引导加载程序覆盖复位向量,然后引导加载程序可以分支到伪复位向量.

我的链接器脚本的相关部分是

MEMORY
{
  kseg1_boot_mem     : ORIGIN = 0xBFC00000, LENGTH = 0x480
  bootload_boot_mem  : ORIGIN = 0x9D1F0000, LENGTH = 0x480
}

SECTIONS
{
  .reset 0xBFC00000 :
  {
    KEEP(*(.reset))
  } > kseg1_boot_mem

  .bootloadreset 0x9D1F0000 :
  {
    KEEP(*(.reset))
  } > bootload_boot_mem
}

使用此功能可以按预期填充0xBFC00000处的区域,但不会将任何内容放在0x9D1F0000处.我已经尝试将选项–no-gc-sections传递给链接器,但它似乎没有任何区别.

我的问题是:是否有可能强制链接器将相同的代码放入2个不同的部分,以及如何做到这一点?

最佳答案 无论是否是解决此问题的正确方法,我提出的解决方案是:

通过从.reset部分删除KEEP(*(.reset))块,将启动代码移动到0x9D1F0000区域.
在重置地址放置一个asm函数,该地址跳转到重定位的启动代码.
允许引导加载程序覆盖asm函数,因为它将在完成其工作时分支到启动代码.

点赞