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

在程序编译的过程中,链接脚本起了非常大的作用,对各个.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

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

此条目发表在其他分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。