weiqi7777

静态程序编译链接与加载(五)链接脚本大作战

0
阅读(1380)

在程序编译的过程中,链接脚本起了非常大的作用,对各个.o文件,如何组合,VMA与LMA如何定义,都由这个文件来决定。

下面,针对链接脚本,进行一系列的实验。

一、最简单链接脚本,代码段和数据段,合成一个segment

链接脚本如下图所示:

数据段,紧跟代码段

代码段和数据,最终合成一个segment

全部的section,都合并到一个segment中了。segment的属性是RWE。

二、代码段和数据段分开,生成2个segment

链接脚本如下:

一般代码段和数据段,是会放在不同的位置的。

在链接脚本中,分别定义代码段和数据的起始地址

三、使用AT定义加载地址

链接脚本如下所示:

一般来说,加载地址和链接地址是一样的。但是可以在链接脚本中,使用AT关键字,来指定链接地址。

boot段,映射到了segment0, va为0x50000000, pa为0

text1段和text2段,映射到了segment1,va为0x60000000, pa为0x400

data段和data1段,映射到了segment2,va为0x80000000,pa为0x1000

四、使用MEMORY关键字,定义memory空间

在链接脚本中,可以使用MEMORY关键字,定义memory空间,格式如下图:

  • 使用MEMORY,可以定义memory空间。
  • NAME是memory的名字
  • ATTR,是memory的属性, RWX
  • ORIGIN: VA地址
  • LENGTH: memory大小

以下链接脚本:

ELF的segment信息如下图:

boot段,映射到了segment0, va为0x10000000, pa为0

text1段和text2段,映射到了segment1,va为0x20000000, pa为0x400

data段和data1段,映射到了segment2,va为0x5000000,pa为0x1000

可见,在链接脚本中 .= 赋值,是没有作用的。