使用GNU ld,如何自动将代码分布到多个区域?

时间:2019-04-22 17:15:55

标签: memory embedded ld

我有一种情况,我的ROM只能占据不相交的某些内存区域。例如,假设我在链接器脚本中定义了以下内存区域:

([A-Z0-9]{6})\s([A-Z]{4})\s([0-9]{6})([\^|r])+\s([A-Z]+)([\^|r\s]+)(.+)

我想要的是将代码放入()直到充满,然后将代码放入MEMORY { lowrom (rx) : ORIGIN = 0x5000, LENGTH = 0x2000 midrom (rx) : ORIGIN = 0xD000, LENGTH = 0x1000 hirom (rx) : ORIGIN = 0xF000, LENGTH = 0x1000 } 直到充满,然后将其余的代码放入{ {1}}。

GNU ld文档说The linker will not shuffle sections around to fit into the available regions.,这听起来像我想做的事是不可能的。

有某种解决方法吗?我要避免手动选择进入哪个内存区域的内容。

(或者是否有另一个不支持此功能的开源可重定向目标链接器?)

1 个答案:

答案 0 :(得分:0)

我认为没有直接的方法。

我认为有一种解决方法。

让我用例子来解释。

a)假设代码大小为<0x2000字节,然后在链接描述文件中添加如下所示的lowrom。

记忆力

{

lowrom(rx):起源= 0x5000,长度= 0x2000

}

b)假设代码大小为0x2050字节,然后在链接描述文件中添加lowrom和midrom。

请注意,对于midrom,仅分配所需的字节数

记忆力

{

lowrom(rx):起源= 0x5000,长度= 0x2000

midrom(rx):来源= 0xD000,长度= 0x0050

}

这样您就可以继续