KEIL MDK 分散加载的结构-2-语法 语法、枯燥的、烦人的语法……,但是有些时候木有办法,我本来也不想写这些东西,但确实绕不过去,我认为把它当成一种工具比较合适,了解大概结构以及基本的语法,一些细节没必要记的那么清楚,遇到问题的时候知道去哪里查就好了,这部分东西来自Keil的帮助文档,帮助文档中内容更加丰富也更加复杂,我节选出了一部分,了解这些基本可以搞定绝大多数应用,节选了部分关键内容,供参考。 1、加载域描述 加载域 load_region_name (base_address | ("+" offset)) [attribute_list] [max_size] } 其中: load_region_name: 加载域名称。 base_address: 指定要在其中链接加载域中对象的地址。 base_address 必须是字对齐的。 +offset: 描述一个基址,该基址超出前一个加载区末尾 offset 个字节。offset 的值必须能被 4 整除。 如果这是第一个加载域,则 +offset表示基址从零后面的 offset 个字节开始。 attribute_list: 指定加载域内容的属性: RELOC: 此区可重定位。 max_size : 指定加载域的最大大小。 这是在进行任何解压缩或零初始化之前 数多于 max_size,则 armlink 会生成错误。 execution_region_description: 指定执行域的名称、地址和内容。 2、执行域描述 执行域 exec_region_name (base_address | "+" offset) [attribute_list] [max_size | length] } exec_region_name: 命名执行区。 base_address : 指定要在其中链接执行区中对象的地址。 base_address 必须是字对齐的。 +offset: 描述一个基址,该基址超出前一个执行区末尾 offset 个字节。offset 的值必须能被 4 整除。 如果前面没有执行区(即,这是加载区中的第一个执行区),则 +offset 表示基址从该执行区所在的加载区的基址后面 offset 个字 节开始。 attribute_list: 它指定执行区内容的属性: ABSOLUTE: 绝对地址。 区执行地址是由基址指示符指定的。 ALIGN alignment :将执行区的对齐约束从 4 增加到 alignment。alignment 必须为 2 的正数幂。如果执行区具有 base_address,则必须为 alignment 对齐。 如果执 行区具有 +offset,则链接器将计算得到的区基 址与 alignment 边界对齐。 EMPTY: 在执行区中保留一个给定长度的空白内存块,通常供堆或堆栈使用。 不能将任何节放置在具 有 EMPTY 属性的区中。 FILL: 创建一个链接器生成的区,其中包含一个值。如果指定 FILL,则必须为其赋值,例如: FILL 0xFFFFFFFF。FILL 属性会替代以下组合: EMPTY ZEROPAD PADVALUE。 在某些情况下(例如仿真),长时间的零循环 是比较合适的。 FIXED: 固定地址。 链接器尝试通过插入填充使执行地址等于加载地址。 这会使区成为根区。 如果这 无法完成,则链接器会生成错误。 NOCOMPRESS: 缺省情况下,将启用 RW 数据压缩。 使用NOCOMPRESS 关键字可以指定不能在最终映像中 压缩执行区中的 RW 数据。 OVERLAY: 用于具有重叠的地址范围的节。 将为具有OVERLAY 属性且基址偏移为 +0 的连续执行区指 定相同的基址。 PADVALUE: 定义任何填充的值。 如果指定 PADVALUE,则必须为其赋值,例如: EXEC 0x10000 PADVALUE 0xFFFFFFFF EMPTY ZEROPAD 0x2000 这会创建一个大小为 0x2000 且充满0xFFFFFFFF 的区。 PADVALUE: 必须为一个字大小。将忽略加载区中 的 PADVALUE 属性。 PI: 此区仅包含与位置无关的节。 SORTTYPE: 指定执行区的排序算法。 UNINIT: 用于创建包含未初始化的数据或内存映射的I/O 的执行区。 ZEROPAD: 零初始化的节作为零填充块写入 ELF 文件,因此,运行时无需使用零进行填充。 只有根执行区能够使用 ZEROPAD 属性进行零初始 化。 如果将 ZEROPAD 属性用于非根执行区,则会 生成警告并忽略该属性。 在某些情况下(例如仿真),长时间的零循环是比较合适的。 max_size: 对于标记为 EMPTY 或 FILL 的执行区,max_size 值会解释为区的长度。 在其他情况下,max_size 值会解释为执行区的最大大小。 [–]length: 只能与 EMPTY 一起使用,以表示在内存中向下增长的堆栈。 如果指定的长度为负值,则将 base_address 作为区结束地址。 input_section_description指定输入节的内容。 3、输入节描述 输入节: input_section_description ::= ("+" input_section_attr | input_section_pattern | input_symbol_pattern) module_select_pattern: · 库成员名称(不带前导路径名)。 · 从中提取节的库的完整名称(包括路径名)。 如果名称包含 正整数后缀。 使用最大整数指定的优先级最高。 input_section_attr 以下属性选择器模式描述了节在执行区中的放置顺序: 第一个和最后一个节 此模式是正确的。 *(+FIRST, section) · 如果两个执行区具有同等的明确性,其中一个执行
|
|