嵌入式软件开发之: 映像文件存储器映射调整
化搜索。例如,使用*libname.lib匹配C:\lib dir\libname.lib。
另外,ARM链接器支持特殊的模块选择程序模式“.ANY”,允许将输入节分配给执行区,而无需考虑其父模块。使用.ANY以任意分配方式填充执行区。
注意 | 最好不要依赖编译程序生成的或ARM库代码使用的输入段名。因为,这些名称在每次编译之间可以变化,例如编译选项的改变或编译器版本发生变化,都可能引起输入段名称的变化。 |
② input_section_attr
输入段属性符定义了一个用逗号隔开的模式类别。该类表中的每个模式定义了输入段名称或输入段属性匹配方式。当匹配模式使用输入段名称时,它前面必须使用符号“+”,而符号“+”前面紧接的逗号可以省略。
输入段属性不区分大小写。可以是下列属性之一:
· RO-CODE;
· RO-DATA;
· RO,同时选择RO-CODE和RO-DATA;
· RW-DATA;
· RW-CODE;
· RW,同时选择RW-CODE和RW-DATA;
· ZI;
· ENTRY,包含ENTRY点的节。
可以识别以下同义词:
· CODE代表RO-CODE;
· CONST代表RO-DATA;
· TEXT代表RO;
· DATA代表RW;
· BSS代表ZI。
可以识别以下伪属性:
· FIRST;
· LAST。
如果对输入段的排列顺序有特殊的要求,如特定的输入段必须是域中的第一个输入节,而包含校验和的输入段必须是最后一个输入段,可以使用FIRST和LAST标记执行区中的第一个和最后一个段。
FIRST或LAST伪属性必须放在属性列表的最后。
特殊的模块选择程序模式“.ANY”允许在不考虑其父模块的情况下,将输入段分配给执行域。使用一个或多个“.ANY”模式以任意分配方式填充执行域。在大多数情况下,使用单个“.ANY”相当于使用“*”模块选择属性。
在分散载入描述文件中不能使用两个“*”选择属性。但是,可以使用两个变形的选择程序,例如,*A和*B,也可以将.ANY选择属性与模块选择属性一起使用。*模块选择属性的优先级比.ANY高。如果删除了文件中包含*选择属性的部分,.ANY选择属性才能在链接时起作用。
在解析所有其他(非.ANY)输入段描述并且将输入段分配给最匹配的执行区之后,才解析使用.ANY模块选择程序模式的input_section_descriptions。如果有一个以上.ANY模式,则链接程序尽可能多地填充第一个.ANY,然后开始填充下一个.ANY。
每个未被分配的剩余输入段将被分配给具有以下特性的执行区:
· 最大的剩余空间(由max_size的值和已分配给该区的输入段的尺寸确定);
· 匹配.ANY的input_section_description;
· 与输入段的存储器属性相匹配的存储器访问属性(如果有);
· input_section_pattern。
13.4.3 Scatter文件典型用法
1.创建启动域
所谓启动域就是加载地址和执行地址相同的域。系统执行的初始入口点必须要在启动域中,否则链接器将报告以下错误。
Entry point (0x00000000) lies within non-root region ER_ROM
在Scatter文件中确定启动域可以使用下面两种方法。
① 使用ABSOLUTE设置执行区属性,并且对第一个执行区及其所在的加载区使用相同的地址。为确保执行域地址和加载域地址相同,可以将加载域的起始地址和执行域的起始地址设为相同的值或者将第一个执行域的地址偏移量设为0。
下面的例子,指定了一个启动域。
BOOT 0x0000 ;加载域的起始地址在0x0
{
EXER 0x0000 ;指定加载域和执行域的地址相同
{
* (+RO) ;必须将启动域包含在内
}
;其他执行域
}
② 使用FIXED执行域属性,确保指定域的载入地址和执行地址相同。
下面的例子显示了使用FIXED属性,将执行域的起始地址固定在ROM中。
BOOT 0x0000 ;加载域的起始地址在0x0
{
EXER 0x0000 ;指定加载域和执行域的地址相同
{
* (+RO) ;必须将启动域包含在内
}
EXER_INIT 0x8000 FIXED
{
init.o(+RO)
}
}
③ 如果使用分散加载,负责创建执行域的代码和数据不能将其自身复制到另一位置,因此启动域必须包含以下内容。
· _main.o和_scatter*.o:包含复制代码和数据的代码。
· Region$$Table和ZISection$$Table段:包含要复制代码和数据的地址。
· _dc*.o:执行代码压缩。
可以使用armlinker产生的InRoot$$Sections符号放置启动代码。因为这些代码被定义为只读属性,所有如果Scatter文件中包含了“* (+RO)”,则表示启动域中包含了这些代码。或者显式的使用InRoot$$Sections符号在Scatter文件中对以上代码进行配置。
下面的例子显示了
- 基于DSP的导弹仿真器嵌入式组件设计(04-30)
- 为嵌入式软件建立统一软件系统框架的方法详介(05-23)
- 在VIM中实现对嵌入式软件的调试(08-06)
- 基于仿真的嵌入式软件白盒覆盖测试系统设计(08-26)
- 嵌入式软件运行剖面建模及测试用例生成(11-06)
- 嵌入式软件与硬件的集成测试过程研究(11-16)