我试图强制链接器(来自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函数,因为它将在完成其工作时分支到启动代码.