### ARM Linker 知识点详解 #### 1. 概论 ARM Linker 是一个重要的工具,用于处理目标文件并生成最终可执行文件或库文件。它通过一个链接脚本(linker script)来控制链接过程,这些脚本定义了如何组织输入文件中的各个部分(sections),以及它们在输出文件中的布局方式。链接脚本通常以 .lds 作为扩展名。 链接器有一个默认的内置链接脚本,可以通过 `ld --verbose` 命令查看。当使用 `-T` 选项时,可以指定一个自定义的链接脚本来覆盖默认的链接脚本。此外,`-r` 和 `-N` 选项也会影响链接过程。 #### 2. 基本概念 - **输入文件**:链接器处理的目标文件或链接脚本文件。 - **输出文件**:链接后的目标文件或可执行文件。 - **目标文件格式**:大多数现代操作系统采用 ELF (Executable and Linkable Format) 格式。 - **Section**:目标文件中的独立单元,如 `.text`(代码段)、`.data`(已初始化数据段)、`.bss`(未初始化数据段)等。 - **输入 Section**:输入文件中的 section。 - **输出 Section**:输出文件中的 section。 - **Loadable Section**:在程序运行时会加载到内存中的 section。 - **Allocatable Section**:在程序运行时会在内存中预留一定空间的 section,即使其中不包含任何实际数据。 #### 3. 脚本格式 链接脚本通常遵循特定的格式,其中包括定义内存布局、section 的排列、内存区域、程序头表等。这些脚本允许用户精确控制输出文件的结构。 #### 4. 简单例子 例如,一个简单的链接脚本可能只包含以下几行: ```plaintext OUTPUT_ARCH(arm) OUTPUT_FORMAT(elf32-littlearm) ENTRY(_start) SECTIONS { . = 0x80000000; .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } } ``` 此脚本定义了输出文件的架构、格式,并指定了入口点 `_start`。它还定义了三个 section 的布局:`.text`、`.data` 和 `.bss`。 #### 5. 简单脚本命令 - **OUTPUT_ARCH(arch)**:指定输出文件的架构。 - **OUTPUT_FORMAT(format)**:指定输出文件的格式。 - **ENTRY(symbol)**:定义程序的入口点。 - **MEMORY**:定义可用的内存区域及其属性。 - **PHDRS**:定义程序头表(Program Header Table)的条目。 - **VERSION**:定义版本信息。 - **SECTIONS**:定义 section 的布局。 #### 6. 对符号的赋值 链接脚本可以通过符号来控制输出文件的行为。例如,可以设置符号的值或者控制它们在输出文件中的位置。 #### 7. SECTIONS 命令 `SECTIONS` 命令用于定义输出文件中 section 的布局。它允许指定 section 的起始地址、排序方式以及如何合并来自不同输入文件的相同类型的 section。 #### 8. MEMORY 命令 `MEMORY` 命令用于定义内存区域的特性,如其名称、起始地址、长度和类型(如可读/写、可执行等)。 #### 9. PHDRS 命令 `PHDRS` 命令用于定义程序头表的结构,这在创建可执行文件时特别有用。 #### 10. VERSION 命令 `VERSION` 命令用于定义输出文件的版本信息。 #### 11. 脚本内的表达式 链接脚本支持使用各种表达式来计算地址和其他值。例如,可以使用 `. = 0x80000000;` 来设置当前地址为 `0x80000000`。 #### 12. 暗含的连接脚本 除了显式的链接脚本外,还有一些暗含的连接脚本规则。例如,如果未指定某个 section,则链接器可能会按照默认规则来处理这些 section。 #### 总结 ARM Linker 及其链接脚本对于嵌入式系统开发至关重要,尤其是当需要对输出文件进行精细化控制时。了解链接脚本的基本概念、命令和格式可以帮助开发者更好地管理程序的布局和行为。通过合理的配置,可以优化程序的性能和资源使用。


































剩余21页未读,继续阅读


- 粉丝: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 储能参与现货电能量-调频辅助服务市场的双层交易决策研究附Matlab代码.rar
- 城市轨道交通供电系统研究附Matlab代码.rar
- 采用SRF算法的分流有源滤波器【并联有源滤波器的仿真电路可降低谐波和无功功率】附Matlab代码.rar
- 电池与太阳能光伏系统的充电控制,通过比较电气需求和发电数据来控制电池何时充电附Simulink仿真.rar
- 【最新版】 GJB 777B-2021 交流测速发电机通用规范.rar
- 创新!高级!【日前、日内非滚动、日内滚动调度以及实时修正】考虑需求侧响应的智慧楼宇多时间尺度调度策略附Matlab代码.rar
- 对采样磁场进行低频剂量评估附Matlab代码.rar
- 电动汽车参与运行备用的能力评估及其仿真分析附Matlab代码.rar
- 多接地配电系统的基于PMU的系统状态估计附Matlab代码.rar
- 多输入多输出系统(MIMO)中的水填充算法研究附Matlab代码.rar
- 【最新版】 GJB 151C-2024 军用设备和分系统 电磁发射和敏感度要求与测量.rar
- 【最新版】 GJB 939A-2022《外购器材的质量管理》.rar
- 【最新版】 GJB 981A-2021《粘弹阻尼材料强迫非共振型动态测试方法》.rar
- 【最新版】 GJB 981A-2021《粘弹阻尼材料强迫非共振型动态测试方法》 (1).rar
- 【最新版】 GJB 2489A-2023《航空机载设备履历本及产品合格证编制要求》.rar
- 【最新版】 GJB 5792A-2021《军用涉密信息系统电磁屏蔽体等级划分和测量方法》.rar


