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

Linker 强制链接器将相同的代码放在两个部分中,linker,ld,pic,Linker,Ld,Pic,我试图强制链接器(ld来自XC32)在flash的两个不同部分中放置相同的可执行代码 应用程序是这样的,代码可以作为独立的应用程序运行,也可以由引导加载程序覆盖重置向量,引导加载程序随后可以分支到伪重置向量 我的链接器脚本的相关部分如下 MEMORY { kseg1_boot_mem : ORIGIN = 0xBFC00000, LENGTH = 0x480 bootload_boot_mem : ORIGIN = 0x9D1F0000, LENGTH = 0x480 } S

我试图强制链接器(ld来自XC32)在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处未放置任何内容。我已经尝试过将选项传递给链接器——没有gc节,但似乎没有任何区别


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

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

通过从.reset部分移除KEEP(*.reset))块,将启动代码移动到0x9D1F0000处的区域。 将asm功能置于跳转至重新定位的启动代码的重置地址。
允许引导加载程序覆盖asm函数,因为它完成工作后将分支到启动代码。

我通过添加新的内存区域解决了这个问题

MEMORY
{
  virtual_boot               : ORIGIN = 0xBFC00000, LENGTH = 0x200
  .
  .
  .
} 
然后在第一节中添加

SECTIONS
{
  .virtualboot :
  {
    /*KEEP(*(.virtualboot))*/
    LONG(0x08000000 | ((_RESET_ADDR & 0x1FFFFFFF) >> 2));
    LONG(0x00);
  } > virtual_boot
  .
  .
  .
}
_RESET_ADDR应该在前面定义,在我的代码中是

_RESET_ADDR = (0x9D006000 + 0x1000);

这样,我的代码就可以在有/没有引导加载程序的MCU上运行了

我可以在构建系统中解决这个问题,方法是用适当的变体编译相同的代码两次。这有点低效,但它只依赖于链接器中被充分理解的行为。