ZHCU875Z August 2001 – October 2023 SM320F28335-EP
在Example8-3 中,链接器从输入文件中获取所有 .text 段,并将它们组合到 .text 输出段中。链接器按照其在输入文件中遇到 .text 输入段的顺序连接这些输入段。链接器对 .data 和 .ebss 或 .bss 段执行类似的操作。用户可以将这种类型的规范用于任何输出段。
用户可以显式指定构成输出段的输入段。每个输入段由其文件名和段名标识。如果文件名带有连字符(或包含特殊字符),请将其放入引号中:
SECTIONS
{
.text : /* 构建 .text 输出段 */
{
f1.c.obj(.text) /* 链接来自 f1.c.obj 的 .text 段 */
f2.c.obj(sec1) /* 链接来自 f2.c.obj 的 sec1 段 */
"f3-new.c.obj" /* 链接来自 f3-new.c.obj 的所有段 */
f4.c.obj(.text,sec2) /* 链接来自 f4.c.obj 的 .text 段和 sec2 段 */
}
}
输入段之间不必使用相同名称,也不必与它们所属的输出段具有相同名称。如果列出某个文件时未提供段,则其所有的段都将包含在输出段中。如果任何其他输入段与输出段同名,但未通过 SECTIONS 指令显式指定,则其将在输出段的末尾自动链接进来。例如,如果链接器在前面的示例中发现更多 .text 段,并且这些 .text 段没有在 SECTIONS 指令中的任何位置指定,则链接器将在 f4.c.obj(sec2) 之后连接这些额外的段。
Example8-3 中的规范实际上是以下内容的简略表达:
SECTIONS
{
.text: { *(.text) }
.data: { *(.data) }
.ebss: { *(.ebss) }
}
规范 *(.text) 表示所有输入文件中未分配的 .text 段。这种格式在以下情况下很有用:
以下示例展示了上述两种用途:
SECTIONS
{
.text : {
abc.c.obj(xqt)
*(.text)
}
.data : {
*(.data)
fil.c.obj(table)
}
}
在此示例中,.text 输出段包含来自文件 abc.c.obj 的指定段 xqt,后跟所有 .text 输入段。.data 段包含所有 .data 输入段,后跟来自文件 fil.c.obj 的指定段表。此方法包括所有未分配的段。 例如,如果当链接器遇到 *(.text) 时其中一个 .text 输入段已包含在另一个输出段中,则链接器无法将第一个 .text 输入段添加到第二个输出段中。
每个输入段充当一个前缀,以收集名称更长的段。例如,模式 *(.data) 与 .dataspecial 匹配。因此,前缀启用子段(在下一节中将介绍这些子段)。