1、链接脚本格式
<SECTIONS>基本命令
SECTIONS
描述输出文件的映射图:
->
输出文件各段、各文件怎么放置
一个SECTIONS命令内部包含一个或多个段,段是连接脚本的基本单元,它
表示输入文件某部分怎么放置;
格式:
SECTIONS{
...
secname start ALIGN(align)(NOLOAD):AT(ldadr)
{contents}>region:phdr=fill
...
}
secname:命名这个段
contents:用来确定代码的什么部分放在这个段
start:是这个段的重定位地址,也叫运行地址。如果代码中有位置无关的
指令,程序在运行时必须放在这个地址上。
ALIGN(align):虽然指定了运行地址,但仍可以使用ALIGN(align)来指定
对齐的要求---这个对齐的地址才是真正的地址
(NOLOAD):来告诉加载器,在运行时不用加载这个段
AT(ldadr):指定这个段在编译出来的映像文件中的地址——加载地址
2、链接脚本实例分析
SECTIONS {
. = 0x33f80000; //链接地址为 0x33f80000,因为较前的地址用于存储内核,且 0x33f80000跟最高地址0x34000000相差512K,程序不会超过512K.text : { *(.text) } //所有文件的代码段
. = ALIGN(4); //代码以4字节对齐
.rodata : {*(.rodata*)} //所有文件的只读数据段
. = ALIGN(4); //代码以4字节对齐
.data : { *(.data) } //所有文件的数据段
. = ALIGN(4); //代码以4字节对齐
__bss_start = .; //
.bss : { *(.bss) *(COMMON) } //所有文件的bss段,bss段是没有初始化的全局变量,或者初始化为0的全局变量,程序假设有一万个全局变量,这一万个全局变量初始值都是0,难道编译出来的程序里面要存放一万个0吗?编译出来的二进制文件不会含有初始值为0的变量。程序运行前先把bss段占用的内存清零,相当于把所有变量初始值设为0.
__bss_end = .;
}