链接文件lds的一个例子解析

来源:互联网 发布:中粮我买网淘宝店 编辑:程序博客网 时间:2024/06/14 08:13

开始构造section了。由于使用的语法是固定的,我们只需要了解一个例子,其余的就可举一反三。以第一个section为例:

.text.head : AT(ADDR(.text.head) - LOAD_OFFSET) {

      _text = .;               /* Text and read-only data */

       *(.text.head)

  } :text = 0x9090

.text.head : AT(ADDR(.text.head) - LOAD_OFFSET) {

      _text = .;               /* Text and read-only data */

       *(.text.head)

  } :text = 0x9090

 

.text.head指定了生成的section的名字,后面的冒号是固定语法。AT关键字前面介绍过,指定该section的加载地址(LMA),它的完整表达是

AT(expression)

括号中expression表达式指定LMA的值。在此例中该表达式由

ADDR(.text.head) - LOAD_OFFSET

计算得到。这里

ADDR(section)

计算section的虚拟地址,故.text.head的加载地址(LMA)是它的物理地址。在大括号内部,_text = .;                                                                        

定义了一个全局变量,它的值为”.”的当前值,记录了整个text segment的起始地址.。在这里,由于_text变量前还没有任何section被创建,故_text有如下等价关系:

_text = ADDR(.text.head) = . = LOAD_OFFSET + LOAD_PHYSICAL_ADDR;

*(.text.head)完成了具体的section创建工作,”*”代表所有输入的.o文件,括号中的.text.head指定了链接器感兴趣的section名。

*(text.head)

表示从所有输入文件中抽取名为.text.headsection并填充到目标文件的.text.head section中。

: text

指定了新生成section所在的segment,这里冒号后的textsegment名,可见内核的第一个section被放到了text segment

= 0x9090

指定section的填充内容。从输入文件中抽取来的section由于代码对齐的缘故,其二进制的存放可能是不连续的,这里指定对section中的空隙用0x9090进行填充。0x90是汇编指令NOP的机器码,故相当于在不连续代码间填充空操作。至此,内核的第一个section就创建好了,它名为.text.head,由输入文件的.text.head section构成(并非所有文件都有.text.head section,链接器只从具有该section的文件中抽取内容),该section的虚拟地址(VMA)由”.”的值确定,加载地址(LMA)为其物理地址,section中不连续区域产生的间隙由0x9090填充,最后该section被放入了内核的text segment中。

通过objdump内核,我们可以看到关于该section的最终内容:

Sections:

Idx Name          Size      VMA       LMA       File off  Algn

  0 .text.head    00000375  c1000000  01000000  00001000  2**2

                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE

0 0
原创粉丝点击