ZHCUAU3J January 2018 – March 2024
链接器可以在多个存储器范围之间拆分输出段以提高分配效率。使用 >> 运算符来指示如有必要,可将输出段拆分成指定的存储器范围:
MEMORY
{
P_MEM1 : origin = 0x2000, length = 0x1000
P_MEM2 : origin = 0x4000, length = 0x1000
P_MEM3 : origin = 0x6000, length = 0x1000
P_MEM4 : origin = 0x8000, length = 0x1000
}
SECTIONS
{
.text: { *(.text) } >> P_MEM1 | P_MEM2 | P_MEM3 | P_MEM4
}
在此示例中,>> 运算符指示可在任何列出的存储器区域之间拆分 .text 输出段。如果 .text 段增长到超出 P_MEM1 中的可用存储器,则会在输入段边界上拆分 .text 段,而输出段的其余部分将分配给 P_MEM2 | P_MEM3 | P_MEM4。
| 运算符用于指定多个存储器范围的列表。
还可以使用 >> 运算符来指示可在单个存储器范围内拆分输出段。当多个输出段必须分配到同一存储器范围,但一个输出段的限制会导致存储器范围被分区时,此功能会很有用。考虑以下示例:
MEMORY
{
RAM : origin = 0x1000, length = 0x8000
}
SECTIONS
{
.special: { f1.c.obj(.text) } load = 0x4000
.text: { *(.text) } >> RAM
}
.special 输出段被分配在靠近 RAM 存储器范围中间的地方。这会在 RAM 中留下两个未使用的区域:从 0x1000 到 0x4000,以及从 f1.c.obj(.text) 的末尾到 0x8000。.text 段的规格允许链接器围绕 .special 段拆分 .text 段,并使用 RAM 中 .special 两侧的可用空间。
>> 运算符还可用于在匹配指定属性组合的所有存储器范围之间拆分输出段。例如:
MEMORY
{
P_MEM1 (RWX) : origin = 0x1000, length = 0x2000
P_MEM2 (RWI) : origin = 0x4000, length = 0x1000
}
SECTIONS
{
.text: { *(.text) } >> (RW)
}
链接器会尝试将全部或部分输出段分配至属性与 SECTIONS 指令中指定的属性匹配的任何存储器范围。
此 SECTIONS 指令与以下指令具有相同的效果:
SECTIONS
{
.text: { *(.text) } >> P_MEM1 | P_MEM2}
}
某些段不应拆分:
如果对这些段中的任何一个段使用 >> 运算符,则链接器将发出警告并忽略该运算符。