1.1 ARM RealView® 编译工具映像结构
映像的结构由以下各项定义:
• 映像的组成区和输出节的数量
• 加载映像时这些区和节在内存中的位置
• 执行映像时这些区和节在内存中的位置
描述内存映射时:
• 术语 根区域用于描述加载地址和执行地址相同的区。
• 载入区相当于 ELF 段。
1.1.1 对象和映像的构建块
可执行文件由映像、区、输出节和输入节的层次结构构成:
• 映像由一个或多个区组成。 每个区由一个或多个输出节组成。
• 每个输出节包含一个或多个输入节。
• 输入节是对象文件中的代码和数据信息。
图3-1 显示了区、输出节和输入节之间的关系。
输入节 输入节包含代码、初始化数据,或描述未初始化的或在映像执行前必须设为 0 的内存片断。 这些特性通过RO、RW和 ZI 这样的属性来表示。armlink 使用这些属性,将输入节组织到称为输出节和区的更大的构建块中。
输出节 一个输出节由若干个具有相同 RO、RW 或 ZI 属性的相邻输入节组成。 输出节的属性与组成它的输入节的属性相同。 在输出节中,输入节根据节放置中描述的规则进行排序。
区 一个区由一个、两个或三个相邻的输出节组成。 区中的输出节根据其属性排序。 首先是 RO 输出节,然后是 RW 输出节,最后是 ZI输出节。 区通常映射到物理内存设备,如 ROM、RAM 或外围设备。
1.1.2 映像的加载视图和执行视图
映像区在加载时放入系统内存映射。 在执行映像之前,您可能要将它的一些区移到执行地址并创建ZI 输出节。 例如,必须将已初始化的RW 数据从 ROM中的加载地址复制到 RAM中的执行地址。
映像的内存映射具有以下不同的视图(如图3-2中所示)。
加载视图 根据映像加载到内存时所在的地址(即映像开始执行之前的位置)来描述每个映像的区和节。
执行视图 根据映像执行时所在的地址来描述每个映像的区和节。
1.1.3 指定映像的内存映射
映像可以由任意个区和输出节组成。 所有这些区可以有不同的加载地址和执行地址。 要构建映像的内存映射,armlink 必须有以下各项信息:
分组 如何将输入节分组为输出节和区。
布局 在内存映射中如何安排映像区的位置。
根据映像的内存映射的复杂程度,有两种方法可将此信息传递到 armlink:
使用命令行选项
对于映像只有一个或两个加载区和最多三个执行区的简单情况,
可以使用以下选项:
• --ro-base
• --rw-base
• --ropi
• --rwpi
• --first
• --last
• --split
• --rosplit
1.1.4 映像入口点
必须为程序指定至少一个初始入口点,否则链接器会生成警告。 并非每个源文件都必须具有入口点。 单个源文件中不允许有多个入口点。对于 ROM 起始地址为 0的嵌入式应用程序,可使用 --entry 0x0 (或对于有高位向量的 CPU,可以使用 0xFFFF0000)。
初始入口点必须满足以下条件:
• 映像入口点必须始终在执行区内执行区必须是非重叠的,而且必须是根执行区(加载地址与执行地址相同)。如果不使用 --entry 选项指定初始入口点,则:
• 如果输入对象仅包含一个由 ENTRY 指令设置的入口点,则链接器将使用该入口点作为映像的初始入口点
• 在以下情况时,链接器生成不包含初始入口点的映像:
— 已使用 ENTRY 指令指定多个入口点
— 未使用 ENTRY 指令指定任何入口点。
1.2 使用命令行选项创建简单映像
数个RO、RW和 ZI 类型的输入节可以组成一个简单的映像。 这些输入节整合成RO、RW和 ZI 输出节。 根据载入区和执行区中输出节的排列方式,有三种基础类型的简单映像:
类型 1加载视图中有一个区,执行视图中有三个相邻区。 使用--ro-base选项可创建此类型的映像。有关详细信息,请参阅类型 1,一个加载区和几个连续执行区。
类型 2加载视图中有一个区,执行视图中有三个不连续的区。 使用--ro-base 和 --rw-base 选项可创建此类型的映像。
有关详细信息,请参阅类型 2,一个加载区和几个不连续的执行区。
类型 3加载视图中有两个区,执行视图中有三个不连续的区。 使用--ro-base、--rw-base 和 --split 选项可创建此类型的映像。 您也可以使用--rosplit 选项将缺省载入区分为两个 RO 输出节,一个用于代码,另一个用于数据。
有关详细信息,请参阅类型 3,两个加载区和几个不连续的执行区。
在所有这三种类型的简单映像中,最多允许有三个执行区:
• 第一个执行区包含 RO 输出节
• 第二个执行区包含 RW 输出节(如果有)
• 第三个执行区包含 ZI 输出节(如果有)。
这些执行区称为RO、RW和 ZI 执行区。
也可以用分散加载描述文件创建简单映像。
1.2.1 类型 1,一个加载区和几个连续执行区
此类型的映像由加载视图中的单个载入区和内存映射中相邻放置的三个执行区组成。 此方法适用于将程序加载到RAM 中的系统,例如OS 引导加载程序或桌面系统
也可以使用以下命令创建此类映像:armlink --ro-base 0x8000