标签:
参考:《程序员的自我修养:链接、装载与库》
什么是链接脚本?链接脚本就是程序链接时的参考文件,其主要目的是描述如何把输入文件中的段(SECTION)映射到输出文件中,并控制输出文件的存储布局。链接脚本的基本命令式SECTIONS命令,一个SECTIONS命令内部包含一个或多个段,段(SECTION)是链接脚本的基本单元,它表示输入文件中的某个段是如何放置的。
链接脚本的标准格式如下:
SECTIONS
{
sections-command
sections-command
}
下面我们配合link.lds进行具体讲解:
SECTIONS
{
. = 0xD0024000;
.text : { start.o * (.text)
}
.data : {
* (.data)
}
bss_start = .;
.bss : {
* (.bss)
}
bss_end = .;
}
在链接脚本中,单独的点号(.)代表了当前位,. = 0xD0024000; 表示程序的链接地址是0xD0024000;
link.lds中的.text 、 .data 、 .bss分别是text段、data段、bss段的段名(这些段名并不是固定的,是可以随便起的)。.text段包含的内容是start.o和其余代码中所有的text段;.data段包含的内容是代码中所有的data段;.bss段包含的内容是代码中所有的bss段。
bss_start和bss_end保存的是bss段的起始地址和结束地址,在start.S中会被用到。
下面解释一下什么是data、text、bss段:
1) data段:数据段(datasegment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
2) text段:代码段通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
3) bss段:指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。当我们的程序有全局变量是,它是放在bss段的,由于全局变量默认初始值都是0,所有我们需要手动清bss段。
1.1 链接器脚本基本构成-段
一个可执行程序通常是由:代码段,数据段,bss段构成的。同样,在用于链接这个程序的链接器脚本中,就会反应出这几个段的信息。
创建链接器脚本-段信息
1.2 设置起始链接地址
( . = 0x0; "."表示当前位置)
如上图所示,查看用上图的链接器脚本(左图)生成的elf文件的反汇编文件(右图),可以看到代码的起始地址是00000000
如上图所示,查看用上图的链接器脚本(左图)生成的elf文件的反汇编文件(右图),可以看到代码的起始地址是30008000
注:地址变化的影响在后续讲解。
1.3 对齐设置
字节对齐可以提高效率;当代码起始地址不是4字节对齐的,就需要通过. = ALIGN(4):对当前地址4字节对齐。
分别对当前地址、.text段、.data段和.bss段地址4字节对齐
1.4 使用变量
bss_start = . ; 记录bss段首当前地址,保存下来
bss_end = . ; 记录bss段尾当前地址,保存下来
这些地址保存下来,可以在程序中使用
1.5 设置代码段首文件
哪个代码段排在代码的最前面呢?
指明start.o排在最前面,运行程序首先执行start.o,主要是CPU上电要完成初始化;
标签:
原文地址:http://www.cnblogs.com/AP0904225/p/5906161.html