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

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

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

转载地址 http://www.lujun.org.cn/?p=4230
也欢迎访问我的个人网站 http://www.lujun.org.cn

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值