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

use*_*708 5 memory embedded ld

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

MEMORY
{
  lowrom (rx)           : ORIGIN = 0x5000,  LENGTH = 0x2000
  midrom (rx)           : ORIGIN = 0xD000,  LENGTH = 0x1000
  hirom  (rx)           : ORIGIN = 0xF000,  LENGTH = 0x1000
}
Run Code Online (Sandbox Code Playgroud)

我想要的是让代码进入lowrom直到它已满,然后让代码进入midrom直到它充满,然后让剩余的代码进入hirom.

GNU ld 文档说链接器不会随机排列部分以适应可用区域。 所以听起来我想做的事情是不可能的。

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

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

Bab*_*jan 0

我认为没有直接的方法。

我认为有一个解决方法。

让我用例子来解释。

a) 假设代码大小 < 0x2000 字节,然后在链接器脚本中添加 lowrom,如下所示。

记忆

{

lowrom (rx):原点 = 0x5000,长度 = 0x2000

}

b) 假设代码大小为 0x2050 字节,然后在链接器脚本中添加 lowrom 和 midrom。

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

记忆

{

lowrom (rx):原点 = 0x5000,长度 = 0x2000

midrom (rx):原点 = 0xD000,长度 = 0x0050

}

这样你就可以继续前进。