码迷,mamicode.com
首页 > 其他好文 > 详细

链接器脚本

时间:2016-09-25 17:17:09      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

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

 

 

 

    什么是链接脚本?链接脚本就是程序链接时的参考文件,其主要目的是描述如何把输入文件中的段(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段构成的。同样,在用于链接这个程序的链接器脚本中,就会反应出这几个段的信息。

创建链接器脚本-段信息

                     技术分享

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!