链接脚本简介

来源:互联网 发布:mac怎么在pdf上写字 编辑:程序博客网 时间:2024/06/06 13:22

以下内容源于朱有鹏《物联网大讲堂》课程,如有侵权,请告知删除。


1、程序段的概念:代码段(.text)、数据段(.data)、bss段(ZI段)、自定义段


(1)段是指程序的某部分。

  • 把整个程序分成许多段,给每个段起一个名字,在链接时用这个名字来指示这些段。
  • 给段命名,就是为了在链接脚本中,让段站在合适的位置。


(2)段名分为2种:一种是编译器链接器内部定好的,先天性的名字;一种是程序员自己指定的、自定义的段名。

  • 先天性段名:

代码段:(.text)  ,又叫文本段,代码段其实就是函数编译后生成的东西;

数据段:(.data),数据段就是C语言中有显式初始化为非0的全局变量;

bss 段:(.bss) ,又叫ZI(zero initial)段,即零初始化段,对应C语言中初始化为0(或者没有显式初始化)的全局变量。

  • 后天性段名:
段名由程序员自己定义,段的属性和特征也由程序员自己定义。


(3)C语言中全局变量如果未显式初始化,值是0。

  • 本质就是C语言把这类全局变量放在了bss段,从而保证了为0;


(4)如何保证显式初始化为非0的全局变量的值在main之前就被赋值了?

  • 这类变量放在.data段中,而.data段会在main执行之前被处理(初始化)。



2、链接脚本的作用

(1)链接脚本是一个规则文件,用来指挥链接器工作。

  • 链接器会参考链接脚本,使用其中的规则来处理.o文件中那些段(一般情况下,每个.o文件会包含若干个段,而不是只有某个段),将其链接成一个可执行程序。

(2)链接脚本的关键内容有2部分:段名 + 地址(作为链接地址的内存地址)

(3)链接脚本的理解:

SECTIONS {}       这个是整个链接脚本

.                              点号在链接脚本中代表当前位置

=                             等号代表赋值

(4)举例如下(代码的内容是链接到以0xd0024000开始的空间。)

SECTIONS{. = 0xd0024000;//地址.text : {//段名start.o* (.text)}    .data : {* (.data)}bss_start = .; .bss : {* (.bss)}bss_end  = .;}



0 0
原创粉丝点击