本帖最后由 richardnee 于 2011-4-18 00:13 编辑
Part2 基本语法 2.1 BNF 符号与语法 " :由引号赖标示的符号保持其字面原意,如A”+”B标示A+B。 A ::= B :定义A为B。 [A] :标示可选部分,如A[B]C用来标示ABC或AC。 A+ :用来标示A可以重复任意次,如A+可标示A,AA,AAA, … A* :同A+。 A | B :用来标示选择其一,不能全选。如A|B用来标示A或者B。 (A B) :标示一个整体,当和|符号或复杂符号的多次重复一起使用时尤其强大,如(AB)+(C|D)标示ABC,ABD,ABABC,ABABD, … 2.2 分散加载文件各部分描述 (2.1) 如图2.1所示为一个完整的分散加载脚本描述结构图。下面我们对图示中各个部分进行讲述。 2.2.1 加载区描述 每个加载区有: ó名称:供连接器确定不同下载区域 ó基地址:相对或绝对地址 ó属性:可选 ó最大字节数:可选 ó执行区域列:确定执行时各执行区域的类型与位置 load_region_name (base_address | ("+" offset)) [attribute_list] [ max_size ] "{" execution_region_description+ "}"
load_region_name:下载区域名称,最大有效字符数31。(并不像执行区域段名用于Load$$region_name,而是仅仅用于标示下载区域)。 base_address:本区域内部目标被连接到的地址(按字对齐)。 +offset:相对前一个下载区域的偏移量(4的整数倍,如果为第一个区域)。
2.2.2 执行区描述 每个执行区有: ó名称:供连接器确定不同下载区域 ó基地址:相对或绝对地址 ó属性:确定执行区域的属性 ó最大字节数:可选 ó输入段:确定放在该执行区域的模块 exec_region_name (base_address | "+" offset) [attribute_list] [max_size] "{" input_section_description+ "}" exec_region_name:执行区域名称,最大有效字符数31。 base_address:本执行区域目标要被联接到的位置,按字对齐。 +offset:相对于前一个执行区域结束地址的偏移量,4的整数倍;如果没有前继之能够行区域(本执行区域为该下载区域的第一个执行区域),则该偏移量是相对于该下载区域的基址偏移量。 attribute_list:PI,OVERLAY,ABSOLUTE,FIXED,UNINIT。 PI: 位置独立。 OVERLAY: 覆盖。 ABSOLUTE: 绝对地址。 FIXED: 固定地址,下载地址与执行地址具有该地址指示确定。 UNINIT: 未初始化数据。 RELOC:无法明确指定执行区域具有该属性,而只能通过继承前一个执行区或父区域获得。 对于PI,OVERLAY,ABSOLUTE,FIXED,我们只能选择一个,缺省属性为ABSOLUTE。一个执行区域要么直接继承其前面的执行区域的属性或者具有属性为ABSOLUTE。 具有PI,OVERLAY,RELOC属性的执行区域允许其地址空间重叠,对于BSOLUTE,FIXED 属性执行区域地址空间重叠Armlink会报错。 max_size:可选,他用于指使Armlink在实际分配空间大于指定值时报错。 input_section_description:指示输入段的内容。
2.2.3 输入段描述 输入段: ó模块名:目标文件名,库成员名,库文件名。名称可以使用通配符。 ó输入段名,或输入段属性(READ-ONLY,CODE)。 module_select_pattern ["(" ("+" input_section_attr | input_section_pattern) ([","] "+" input_section_attr | "," input_section_pattern))* ")"] 2.2.3.1 module_select_pattern:选择的模块名称(目标文件,库文件成员,库文件),模块名可以使用通配符(*匹配任意多个字符,?匹配任意一个字符),名称不区分字母大小写,它是供选择的样本。 例1:*libtx.a (+RO) libtx.a为threadX库文件。 例2:tx_ill.o (INIT) tx_ill.o为threadX中断向量目标文件。 2.2.3.2 input_section_attr:输入段属性选择子,每个选择子以”+”开头,选择子不区分大小写字符。 选择子可选RO-CODE,RO-DATA,RO( selects both RO-CODE and RO-DATA),RW-DATA,RW-CODE,RW( selects both RW-CODE and RW-DATA),ZI,ENTRY( that is a section containing an ENTRY point)。 以下同义词可以选择:CODE (for RO-CODE),CONST( for RO-DATA),TEXT (for RO),DATA (for RW),BSS (for ZI)。 还有两个伪属性:FIRST,LAST。如果各段的先后顺序比较重要时,可以使用FIRST,LAST标示一个执行区域的第一个和最后一个段。 例1:os_main_init.o (INIT ,+FIRST) FIRST表示放于本执行区域的开始处。 例2:*libtx.a (+RO) RO 表示*libtx.a的只读部分。 2.2.3.3 input_section_pattern:输入段名。 例1:os_main_init.o (INIT ,+FIRST) INIT 为os_main_init.o的一个段。 例2:os_stackheap.o (heap) heap 为os_stackheap.o的一个段。 例3:os_stackheap.o (stack) stack为os_stackheap.o的一个段。 |