链接脚本简单描述

连接脚本的描述都是以节(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并发场景下,HttpServletRequst中session丢失问题

    使用场景: 在list数据进来之后使用安全数组    Lists.newCopyOnWriteArrayList() 进行了   parallelStream  并行处理,在接口中进行了登录者信息接口 ...

  2. 使用Azure Runbook 发送消息到Azure Storage Queue

    客户需要定时发送信息到Azure Storage Queue,所以尝试使用Azure Runbook实现这个需求. 首先新增一个Azure Automation Account的资源. 因为要使用Az ...

  3. python_mmdt:从0到1--实现简单恶意代码分类器(二)

    概述 上篇文章python_mmdt:一种基于敏感哈希生成特征向量的python库(一)我们介绍了一种叫mmdt_hash(敏感哈希)生成方法,并对其中的概念做了基本介绍.本篇,我们重点谈谈mmdt_ ...

  4. centos6-centos7防火墙(iptables-firewalld)设置端口nat转发

    背景: 将本机的 8080端口转发至其他主机,主机 IP:192.168.1.162,目标主机 IP和端口192.168.1.163:80,方法如下: centos6系统iptables环境下: ip ...

  5. 阿里云 Redis 开发规范

    阿里云Redis开发规范-阿里云开发者社区 https://developer.aliyun.com/article/531067 https://mp.weixin.qq.com/s/UWE1Kx6 ...

  6. Python魔法函数与两比特量子系统模拟

    技术背景 本文主要涵盖两个领域的知识点:python的魔法函数和量子计算模拟,我们可以通过一个实际的案例来先审视一下这两个需求是如何被结合起来的. 量子计算模拟背景 ProjectQ是一个非常优雅的开 ...

  7. HTML 5 学习第二课

    元素:<p>+++++++++</P> 全部内容 标签:<P></P> 属性:标签内部的内容 eg:<img src=" "& ...

  8. ThinkPHP 漏洞利用

    ThinkPHP thinkphp_5x_命令执行漏洞 受影响版本包括5.0和5.1版本 docker漏洞环境源码: https://github.com/vulnspy/thinkphp-5.1.2 ...

  9. HttpURLConnection下载文件流

    package com.loan.modules; import sun.net.www.protocol.file.Handler; import java.io.*; import java.ne ...

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

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