链接脚本简单描述

连接脚本的描述都是以节(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. Vue案例之todoLIst实现

    使用Vue实现todolist案例,如有不对敬请大佬多多指教 功能: 1.增加功能:在新增版块里面的输入框内输入数据,点击后面的"添加"按钮,将输入的数据添加到列表中,默认是未完成 ...

  2. 面试常问的ArrayQueue底层实现

    public class ArrayQueue<T> extends AbstractList<T>{ //定义必要的属性,容量.数组.头指针.尾指针 private int ...

  3. MySQL 中的临时表

    在使用 explain 解析一个 sql 时,有时我们会发现在 extra 列上显示 using temporary ,这表示这条语句用到了临时表,那么临时表究竟是什么?它又会对 sql 的性能产生什 ...

  4. mysql(视图 事务 索引 外键)

    视图   视图本质就是对查询的封装   创建视图(定义视图 起名以v_开头) create view v_students as select classes.name as c_name ,stud ...

  5. Docker 中的网络功能介绍 外部访问容器 容器互联 配置 DNS

    Docker 中的网络功能介绍 | Docker 从入门到实践 https://vuepress.mirror.docker-practice.com/network/ Docker 允许通过外部访问 ...

  6. 房产基于Swoole的PHP RPC框架设计

    房产基于Swoole的PHP RPC框架设计 https://mp.weixin.qq.com/s/XSrKEQ-0q4DvjOGTIwYYzg

  7. Service Mesh 在百度网盘数万后端的落地实践

    https://www.infoq.cn/article/vpa6aypkizuqiijzflih

  8. 洛谷P4981

    Description 给定 n 个点,组成一棵树,有多少种组合方法: Analysis 首先,结合题目简化意义和这句话 最多可能存在多少种父子关系 我们可以知道当且仅当有至少一个节点的儿子不同时称他 ...

  9. HBase,以及GeoMesa设计基于HBase的设计分析,从数据模型到典型查询场景,最后进行RowKey设计

    GeoMesa设计基于HBase的设计分析,从数据模型到典型查询场景,最后进行RowKey设计 一.HBase 基本概念 理解KeyValue KeyValue多版本 列定义(1) 列定义(2) Co ...

  10. Spark运行程序异常信息: org.apache.spark.SparkException: Task not serializable 解决办法

    错误信息: 17/05/20 18:51:39 ERROR JobScheduler: Error running job streaming job 1495277499000 ms.0 org.a ...