许多链接脚本是相当简单的。

可能最简单的链接脚本只包含一个命令:'SECTIONS'。我们使用'SECTIONS'命令来描述输出文件的内存布局。

'SECTIONS'命令是一个很强大的命令。在这里我们将描述一个该命令的简单应用。假设现在我们的程序里仅仅由文本代码、初始化数据、未初始化数据组成。它们会相应地存在于`.text`区、`.data`区、`.bss`区中。暂时假设在我们的输入文件里只存在刚才说到的3个区。

在接下来的例子里,让我们假设文本代码会加载在地址0x10000,数据会从地址0x8000000开始。下面的脚本将会做这件事:

```linker script
SECTIONS
{
  . = 0x10000;
  .text : { *(.text) }
  . = 0x8000000;
  .data : { *(.data) }
  .bss : { *(.bss) }
}
```

我们写'SECTIONS'命令,是先写关键字'SECTIONS',而后接着由花括号囊括的一系列符号(symbol)赋值、输出区(output section)描述。

上面例子中,'SECTIONS'命令内部的第一行设置了特殊符号`.`,它是位置计数器(location counter)。如果我们不使用其他方式去指定输出区的地址,那么地址会被设置成位置计数器的当前值。之后位置计数器会增加,增加的量和输出区的大小一样大。在'SECTIONS'命令刚开始的时候,位置计数器的值为'0'。

第二行定义了一个输出区,`'.text`。我们暂时不去管冒号(`:`)语法是什么意思。在输出区名字后面的花括号内部,我们列出需要被放入输出区的输出区名字。星号`*`是一个通配符,它匹配任意文件名。表达式`*(.text)`的指代所有输入文件的`.text`输入区。

由于输出区`.text`在定义的时候位置计数器是`0x10000`,链接器会把输出文件中`.text`区的地址设置成`0x10000`。

剩下的行定义了输出文件中的`.data`区和`.bss`区。链接器会把`.data`输出区放置于地址`0x8000000`。在链接器放置完`.data`输出区后,位置计数器的的值会变成`0x8000000`加上`.data`输出区的大小。这个效果会使得链接器把`.bss`输出区放置在内存中的`.data`输出区的后面。

链接器会确保每个输出区具备所需要的对齐要求,链接器会通过在必要的情况下增加位置计数器做到这一点。在上面的例子里,`.text`区和`.data`区可能满足了任意的对齐要求,不过链接器可能会在`.data`区和`.bss`区中创建一个小的间隔。

就这些了。这就是一个简单而完整的链接脚本。

[GNU LD系列 3.3] 简单的链接脚本例程相关推荐

  1. [GNU LD系列 3.1]一些基本的链接脚本概念

    我们需要定义一些基本的概念和词汇来描述链接脚本语言. 链接器(linker)将一系列输入文件(input files)组合起来变成一个单一的输出文件(output file).输出文件和每一个输入文件 ...

  2. LD链接脚本解析-STM32F4xx

    本篇文章主要围绕项目 STM32_RTOS_GUN 的链接脚本 STM32F417IG_FLASH.ld 进行分析,同时对编写链接脚本的方法进行相应的讲解,尽可能地做到通过阅读这篇文章后能够学会编写简 ...

  3. STM32跑MicroPython的链接脚本分析

    一.链接脚本的简单常识   有时候我们很多文件需要链接到指定的区域,或者叫做段里面,比如在 Linux 里面初始化函数就会放到 init 段里面.因此我们需要能够自定义一些段,这些段的起始地址我们可以 ...

  4. arm-gcc链接器和链接脚本

    本文主要介绍了链接器和链接脚本的基本内容.主要偏向于入门级以及常见容易混淆的知识点. 1. 链接器介绍 在现在软件工程中,程序一般都比较复杂,通常由多个源文件组成.在编译的过程中会对这些源文件进行汇编 ...

  5. 链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)

    原链接:链接脚本(Linker Scripts)语法和规则解析(翻译自官方手册)_BSP-路人甲的博客-CSDN博客_链接脚本语法 为了便于与英文原文对照学习与理解(部分翻译可能不准确),本文中的每个 ...

  6. lds链接脚本基础与例子分析

    1.基础 (1)段 .data段包含初始值非0的全局变量(不管静态还是非静态) .rodata段包含被const修饰的初始值非0的全局变量 .bss段包含初始值为0或未初始的全局变量(不管有没有con ...

  7. 第四天:关看门狗、设置栈、控制icache、重定位、链接脚本

    1.汇编写启动代码:关看门狗 什么是看门狗? 看门狗(watch dog timer看门狗定时器),比如:家门口有一只狗,这个狗定时会饿(譬如两小时一饿),狗饿了就会胡乱咬人,人进进出出要想保证安全必 ...

  8. STM32链接脚本STM32F407ZETx_FLASH.ld

    目录 环境 参考 链接脚本简介 STM32F407ZETx_FLASH.ld文件分析 控制输出文件中内存布局 SECTIONS 环境 代码:STM32CUBEMX-linux版V6.5.0 + STM ...

  9. GNU Radio系列教程(三):初级篇之GNU Radio GRC流图

    本文的目标: (1)使用GNU Radio的标准模块来创建流图GRC程序 (2)学习如何在GRC的模块之间调试.解决问题 (3)理解GRC中的采样模块和限流模块的作用 (4)学习如何使用GNU Rad ...

最新文章

  1. SoapRpcMethodAttribute.OneWay属性
  2. OpenGL 基础图形绘制与投影变换
  3. 计算机应用基础教程2015答案,《计算机应用基础教程(2015版)》_课后题答案.doc
  4. 我国快递年业务量首次突破千亿件大关
  5. 为2440搭建NFS开发环境【ZT】
  6. 这10道大厂Java面试题,我敢打赌90%的人都不会!!!
  7. PHP ceil函数bug错误的解决方案
  8. PPT(office365)之背景图片、矢量图标、颜色搭配使用心得
  9. 卡方检验与方差分析的区别
  10. cad卸载_CAD卸载不干净导致安装失败?别慌!老司机手把手教你卸载!
  11. 基于J2EE的线上打印平台
  12. Seckill学习笔记——Day3(秒杀功能实现)
  13. Nginx之一:Nginx的编译安装
  14. Android:证书生成
  15. 基于SSM酒店管理系统
  16. 第九届全球云计算大会·中国站倒计时一个月!一文揭秘重磅神秘大咖
  17. 数据结构视频教程 -《[猎豹网校]数据结构与算法_C#语言》
  18. OSChina 周日乱弹 ——你除了顺从,还有别的办法么?
  19. 我见过的最脑残也是最好懂的人工神经网络算法教程
  20. iOS7死机率比安卓高2倍!爱疯5S冲进3K档

热门文章

  1. Elasticsearch 性能监控2(五种常见问题的解决办法)
  2. kafka详解及搭建
  3. JSON解析工具比较,主要GSON和FastJSON
  4. java并发初探CyclicBarrier
  5. redis压力测试工具-----redis-benchmark
  6. centos 网卡名称修改
  7. mysql ubuntu 注意点
  8. Cocos2d-x游戏开发之lua编辑器 Sublime 搭建,集成cocos2dLuaApi和自有类
  9. 主流框架的搭建(VUE,React)
  10. C# 设置Word文档背景(纯色/渐变/图片背景)