链接脚本简单描述

连接脚本的描述都是以节(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     为输入段的模式匹配,定义那输入些段会被放到这个输出段中,需要注意的是

[ADDRESS] [AT(LMA)]必须指定具体的地址。[><region>] [AT>LMA region]只需指定MEMORY定义的内存空间,具体地址紧接着上一个output section的末尾地址。

REGION 区域的定义  

主要是用来描述ROM和RAM的地址分布(Memory Map)。定义的方式如下:

MEMORY
{
  name [attr] : ORIGIN = origin, LENGTH = len
  ...
}

其中
<name>    是所要定义的内存区域的名字,
<origin>    是其起始地址,
<len>     为内存区域的大小。
<attr>     属性描述如rx,rw等是可选的

虚拟地址(VMA)和加载地址(LMA)  

VMA(虚拟地址)是指程序本身运行过程的地址空间,是指令中使用的地址。比如一条绝对跳转指令使用的地址就是虚拟地址。所以虚拟地址有时候也会被称为运行地址(链接地址)。之所以称之为虚拟地址因为在有MMU的平台上程序运行使用的都是虚拟地址所以虚拟地址==运行地址(链接地址)。LMA(加载地址)是程序在执行前的加载过程使用的地址也可以理解为存储地址即一个程序应该将程序存储在哪里的描述,这个地址一般由操作系统或引导代码使用。而大多数情况下加载地址是和虚拟地址相同的。因为一个可执行文件作为一个整体被放在内存中开始运行大多数情况下是不需要对可执行文件重新进行移动了。

以上都是我自己现在对链接脚本中的地址的含义的理解如果有不对的麻烦指出,共同进步。

链接脚本再探和VMA与LMA的更多相关文章

  1. 链接脚本之LMA VMA解释

    链接脚本中的LMA和VMA是什么意思.这个问题纠结了一段时间,今天在看<ARM体系结构与编程>时,豁然开朗,写下自己的认识.分享例如以下: LMA:载入地址 位于存储器中的地址  LOAD ...

  2. [转]Linux下的lds链接脚本详解

    转载自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml     一. 概论 每一个链接过程都由链接脚本(lin ...

  3. Linux下的lds链接脚本基础

    转载:http://soft.chinabyte.com/os/104/12255104.shtml   今天在看uboot引导Linux部分,发现要对链接脚本深入了解,才能知道各个目标文件的内存分布 ...

  4. Linux下的lds链接脚本简介

    转载:http://hubingforever.blog.163.com/blog/static/171040579201192472552886/   一. 概论 每一个链接过程都由链接脚本(lin ...

  5. [转]Linux下的链接脚本基础

    [转]http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml 1. 前言 (1)每一个链接过程都由链接脚本(linke ...

  6. Linux下的lds链接脚本详解【转】

    转自:http://www.cnblogs.com/li-hao/p/4107964.html 转载自:http://linux.chinaunix.net/techdoc/beginner/2009 ...

  7. Linux下的lds链接脚本详解

    1. 概论2. 基本概念3. 脚本格式4. 简单例子5. 简单脚本命令6. 对符号的赋值7. SECTIONS命令8. MEMORY命令9. PHDRS命令10. VERSION命令11. 脚本内的表 ...

  8. Linux下的lds链接脚本简介(一)

    转载自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml 一. 概论 每一个链接过程都由链接脚本(linker ...

  9. Linux下的lds链接脚本简介(二)

    七. SECTIONS命令 SECTIONS命令告诉ld如何把输入文件的sections映射到输出文件的各个section: 如何将输入section合为输出section; 如何把输出section ...

随机推荐

  1. Java 迭代器的使用 Iterator

    Java的集合类可以使用for ... each循环 List Set Queue Deque 我们以List为例 其实一个java编译器并不知道如何遍历一个List 编译器只是把一个for ... ...

  2. Convert a string into an ArrayBuffer

    https://github.com/mdn/dom-examples/blob/master/web-crypto/import-key/spki.js How to convert ArrayBu ...

  3. leaving sockets open which can trigger a ResourceWarning in some # cases, and look like a memory leak in others

    # -*- coding: utf-8 -*- """ requests.api ~~~~~~~~~~~~ This module implements the Requ ...

  4. setTimeout、Promise、Async/Await 的区别

    事件循环中分为宏任务队列和微任务队列其中setTimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码 ...

  5. 使用“2”个参数调用“SetData”时发生异常:“程序集“

    使用"2"个参数调用"SetData"时发生异常:"程序集"Microsoft.VisualStudio.ProjectSystem.VS. ...

  6. 五:SpringBoot-多个拦截器配置和使用场景

    SpringBoot-多个拦截器配置和使用场景 1.拦截器简介 1.1 拦截器中应用 2.拦截器用法 2.1 编写两个拦截器 2.1.1 OneInterceptor 拦截器 2.1.2 TwoInt ...

  7. Cisco动态路由(rip)

    接Cisco静态路由,讨论一下Cisco动态路由. 实验环境布置 命令布置动态路由 Router0: Router>enable Router#configure terminal Router ...

  8. 【Android初级】如何实现一个比相册更高大上的左右滑动特效(附源码)

    在Android里面,想要实现一个类似相册的左右滑动效果,我们除了可以用Gallery.HorizontalScrollView.ViewPager等控件,还可以用一个叫做 ViewFlipper 的 ...

  9. Flink-v1.12官方网站翻译-P015-Glossary

    术语表 Flink Application Cluster Flink应用集群是一个专用的Flink集群,它只执行一个Flink应用的Flink作业.Flink集群的寿命与Flink应用的寿命绑定. ...

  10. 秒啊,速来get这9个jupyter实用技巧

    1 简介 jupyter notebook与jupyter lab作为广受欢迎的ide,尤其适合开展数据分析相关工作,而掌握它们相关的一些实用技巧,势必会大大提升日常工作效率.而今天我就来给大家介绍9 ...