链接器脚本

   参考:《程序员的自我修养:链接、装载与库

 

 

 

    什么是链接脚本?链接脚本就是程序链接时的参考文件,其主要目的是描述如何把输入文件中的段(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.1 链接器脚本基本构成-

    一个可执行程序通常是由:代码段,数据段,bss段构成的。同样,在用于链接这个程序的链接器脚本中,就会反应出这几个段的信息。

创建链接器脚本-段信息

                     clip_image002

1.2 设置起始链接地址

( . = 0x0; "."表示当前位置)

                  clip_image003   clip_image005

如上图所示,查看用上图的链接器脚本(左图)生成的elf文件的反汇编文件(右图),可以看到代码的起始地址是00000000

         clip_image007 clip_image009

如上图所示,查看用上图的链接器脚本(左图)生成的elf文件的反汇编文件(右图),可以看到代码的起始地址是30008000

注:地址变化的影响在后续讲解。

1.3 对齐设置

    字节对齐可以提高效率;当代码起始地址不是4字节对齐的,就需要通过. = ALIGN(4):对当前地址4字节对齐。

分别对当前地址、.text段、.data段和.bss段地址4字节对齐

                                   clip_image011

1.4 使用变量

bss_start = . ; 记录bss段首当前地址,保存下来

bss_end = . ; 记录bss段尾当前地址,保存下来

这些地址保存下来,可以在程序中使用

                                         clip_image013

1.5 设置代码段首文件

哪个代码段排在代码的最前面呢?

指明start.o排在最前面,运行程序首先执行start.o,主要是CPU上电要完成初始化;

                            clip_image015

posted @ 2016-09-25 16:14  LoTGu  阅读(1931)  评论(0编辑  收藏  举报