在程序编译的过程中,链接脚本起了非常大的作用,对各个.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
可见,在链接脚本中 .= 赋值,是没有作用的。