链接脚本的描述都是以节(section)的单位的,网上也有不少描述连接脚本语法的好文章,再不济还有官方的说明文档能够用来学习,其实主要就是对编译构建的整个过程有了深刻的理解后就能对连接脚本的理解更加容易了,我这里只是简单的记录一下连接脚本最基础核心的内容。连接脚本描述一个输出节的方式以下:学习
SECTION> [ADDRESS] [(TYPE)] : [AT(LMA)] { OUTPUT-SECTION-COMMAND OUTPUT-SECTION-COMMAND ... } [>REGION] [AT>LMA_REGION] [:PHDR :PHDR...] [=FILLEXP]
其中:
SECTION 为输出段的名字定义
[ADDRESS] 为输出段的VMA 虚拟地址
[(TYPE)] 为输出段的类型
[AT(LMA)] 为输出段的LMA 加载地址
[>REGION] 为输出段的VMA 地址依次累加
[AT>LMA_REGION] 为输出段的LMA 地址依次累加
[:PHDR :PHDR...],[=FILLEXP] 不多用
OUTPUT-SECTION-COMMAND 为输入段的模式匹配,定义那输入些段会被放到这个输出段中,须要注意的是spa
[ADDRESS] 和 [AT(LMA)]必须指定具体的地址。[><region>] 和 [AT>LMA region]只需指定MEMORY定义的内存空间,具体地址紧接着上一个output section的末尾地址。操作系统
主要是用来描述ROM和RAM的地址分布(Memory Map)。定义的方式以下:code
MEMORY { name [attr] : ORIGIN = origin, LENGTH = len ... }
其中
<name> 是所要定义的内存区域的名字,
<origin> 是其起始地址,
<len> 为内存区域的大小。
<attr> 属性描述如rx,rw等是可选的blog
VMA(虚拟地址)是指程序自己运行过程的地址空间,是指令中使用的地址。好比一条绝对跳转指令使用的地址就是虚拟地址。因此虚拟地址有时候也会被称为运行地址(连接地址)。之因此称之为虚拟地址由于在有MMU的平台上程序运行使用的都是虚拟地址因此虚拟地址==运行地址(连接地址)。LMA(加载地址)是程序在执行前的加载过程使用的地址也能够理解为存储地址即一个程序应该将程序存储在哪里的描述,这个地址通常由操做系统或引导代码使用。而大多数状况下加载地址是和虚拟地址相同的。由于一个可执行文件做为一个总体被放在内存中开始运行大多数状况下是不须要对可执行文件从新进行移动了。内存
以上都是我本身如今对连接脚本中的地址的含义的理解若是有不对的麻烦指出,共同进步。文档