ZHCUAU3J January 2018 – March 2024
可将一个段分配到由 MEMORY 指令定义的存储器范围中(请参阅节 12.5.4)。以下示例将指定范围并将段链接到这些范围中:
MEMORY
{
SLOW_MEM (RIX) : origin = 0x00000000, length = 0x00001000
FAST_MEM (RWIX) : origin = 0x03000000, length = 0x00000300
}
SECTIONS
{
.text : > SLOW_MEM
.data : > FAST_MEM ALIGN(128)
.bss : > FAST_MEM
}
在此示例中,链接器将 .text 放置到名为 SLOW_MEM 的区域中。.data 和 .bss 输出段将分配到 FAST_MEM 中。可在指定的存储器范围内对齐某个段;.data 段在 FAST_MEM 范围内的 128 字节边界上对齐。
同样,可将一个段链接到具有特定属性的存储器区域中。为此,请指定一组属性(括在圆括号中)而不是存储器名称。使用相同的 MEMORY 指令声明,可指定:
SECTIONS
{
.text: > (X) /* .text --> executable memory */
.data: > (RI) /* .data --> read or init memory */
.bss : > (RW) /* .bss --> read or write memory */
}
在此示例中,.text 输出段可以链接到 SLOW_MEM 或 FAST_MEM 区域中,因为这两个区域都具有 X 属性。.data 段也可以进入 SLOW_MEM 或 FAST_MEM 中,因为这两个区域都具有 R 和 I 属性。但是,.bss 输出段必须进入 FAST_MEM 区域,因为只有 FAST_MEM 的声明中具有 W 属性。
尽管链接器首先使用较低的存储器地址并在可能的情况下避免碎片化,但您无法控制将段分配在指定存储器范围中的何处。在前面的示例中,假设不存在冲突性分配,.text 段将从地址 0 开始。如果某个段必须从特定地址开始,请使用绑定而不是指定的存储器。