GNU linker ld —— Simple Linker Script Example

GNU linker ld (GNU Binutils) version 2.42 —— Linker Scripts:Simple Linker Script Example

个人笔记,仅供参考!!

最简单的链接脚本只有一个命令:SECTIONS,用来描述输出文件的内存布局。

这里提供一个简单用法示例:假设程序(输入文件)中只包含代码、已初始化数据和未初始化数据,并分别位于.text.data.bss段中,期望将代码在0x10000开始的区域,数据在0x8000000开始的区域。以下是一个能够实现此目的的链接脚本:

1
2
3
4
5
6
7
8
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}

这个示例中,关键字SECTIONS后跟一系列符号赋值和输出段描述,这些描述被包含在花括号中。

SECTIONS命令中的第一行设置了特殊符号.的值,即位置计数器。如果没有以其他方式指定输出段的地址,则该输出段地址将从位置计数器的当前值设置开始。然后,位置计数器会增加该输出段的大小。
SECTIONS命令开始时,位置计数器的值为 0 。

第二行定义了一个输出段.text,冒号是必需的语法,在输出段名称后的花括号内,列出了应该放置到此输出段中的输入段的名称。*是一个通配符,匹配任何文件名。表达式(.text)表示输入文件中.text输入段。

由于在定义输出段.text时位置计数器是0x10000,链接器将设置输出文件中.text段的地址为‘0x10000’。

剩余行定义了输出文件中的.data.bss段。链接器脚本指定.data输出段放置在地址0x8000000。在.data输出段后,位置计数器的值将是0x8000000加上.data输出段的大小。因此,.bss输出段紧接在内存中的.data输出段之后。

链接器将确保每个输出段都具有所需的对齐。此外,还可以手动通过增加位置计数器或特殊命令(如ALIGN)来实现特殊的对齐要求。

参考连接:

【1】https://sourceware.org/binutils/docs/ld/Simple-Example.html