GNU链接脚本学习(1)

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

SECTIONS命令是非常强大的,在这我们将解释它的简单用法。

现在假设你的程序只是由单一代码段、初始化数段和未初始化数据段,分别对应.text、.data、.bss的段名。再假设输入文件中也只出现这些段。

在这个例子中,制定代码段装入地址在0x10000,数据段开始在0x8000000,下面脚本即是脚本描述:

SECTIONS

{

. = 0x10000;

.text :

{

*(.text)

}

. = 0x8000000;

.data :

{

*(.data)

}

.bss :

{

*(.bss)

} }

关键字SECTIONS作为命令,后面跟随的是花括号中包含符号分配和输出描述串。

在SECTIONS里面第一行特殊符号.是用作位置计数。如果你没有以其它方式指定输出段地址(其它方式以后在讲解),则地址被设置成位置计数的当前值。位置计数依从输出区大小增长,在SECTIONS命令起始处位置计数赋值为0。

第二行定义输出区.text,冒号是语法必须的,现在可以忽略。输出区名字后面的花括号内,列出所有输入区名字,他们将被安置到输出区中。*是通配符,匹配任何文件名。表达式*(.text)意思是所有输入文件的输入区。

因为位置计数在输出区中定义为0x10000,链接器就会设置输出文件.text地址到0x10000。

剩下行定义输出文件.data和.bss区,链接器将安排.data输出区在地址0x8000000。链接器安排好.data输出区后,位置计数的值将是0x8000000加.data输出大小,作用就是链接器在内存中紧跟.data输出区安排.bss输出区。

链接器确保每个输出区是对齐的,需要时通过增长位置计数。这个例子中指定.text和.data区地址将满足强制对齐,但是链接器可能会建立间隙在.data和.bss之间。

到此为止,这就是一个简单而又完整的链接脚本.

经验分享 程序员 微信小程序 职场和发展