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

时间:2015-11-26 11:46:24

标签: linker ld pic

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

应用程序是这样的,代码可以作为独立的应用程序运行,也可以通过引导加载程序覆盖复位向量,然后引导加载程序可以转移到伪复位向量。

我的链接描述文件的相关部分是

scr

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

我的问题是:是否可以强制链接器将相同的代码放入2个不同的部分,以及如何执行此操作?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我通过添加新的内存区域来解决它

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);

通过这个我的代码可以在带/不带bootloader的MCU上运行