一、输入节构成
输入节由两部分组成:module_select_pattern,input_section_selector。可以有多个input_section_selector,用逗号隔开。input_section_selector又由几个部分组成构成:
"+" input_section_attr,input_section_pattern,input_section_type,input_symbol_pattern
,section_properties。 如图:
一定要用一对小括号( )把input section selector包括起来,跟在module select pattern后面。
二、输入节的语法
input_section_description ::=
module_select_pattern [ "(" input_section_selector ( "," input_section_selector )* ")" ]
input_section_selector ::= "+" input_section_attr
| input_section_pattern
| input_section_type
| input_symbol_pattern
| section_properties
三、输入节说明
输入节的核心思想就是:从一大堆obj文件,库文件中找出目标对象,放到期望的存储器位置中。举个简单的例子来说,我要从一个文件A中找出字符串“test string”,那个文件A就是module_select_pattern, 字符串“test string”就是input_section_selector。 我们可以把module_select_pattern看作一个匹配器,指定需要匹配的范围,把input_section_selector看作选择器,指定需要匹配的内容。下面逐一具体解释module_select_pattern 和 input section selector。
3.1关于module select pattern(勉强范围为:模块匹配器)
用来匹配查找的范围,范围一般是整个工程中的object文件(*.o),库文件,库文件名称,等。可以使用通配符*/?来指定适配范围,通配符*匹配零个或多个字符,通配符?匹配任何单个字符。举例说明常用的几种module select pattern 写法:
❊ * 匹配所有的object文件和库文件;
❊ *.o 匹配所有的object文件;
❊ “file one.o”匹配特定的object文件:file one.o,注意这里由于file one之间有空格,所以需要用“”。
❊ *libname.lib 匹配以libname.lib结尾的所有库;
❊ .ANY 匹配所有的object文件和库文件,类似*,但是*的优先级高于.ANY。
特殊说明:
3.2关于input section selector(勉强翻译为:输入节选择器)
Input section selector放在一对小括号里面,这部分很复杂,共有5个部分的内容:"+" input_section_attr,input_section_pattern,input_section_type,input_symbol_pattern,section_properties。这5个部分并不是必须同时有,只要有一个就可以,当多于一个的时候,没有顺序关系,但是,+FIRST, +LAST应该放在最后。
3.2.1关于input_section_attr (属性选择器)
input_section_attr定义了一些标准属性,可以把这些标准属性,作为期望的匹配内容。每个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.
XO.
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标记执行区域中的第一个和最后一个部分。例如,如果特定的输入部分必须在区域中的第一个,而包含校验和的输入部分则必须在最后。
注意:+FIRST必须放在一个选择器的后面,比如这样:*(section, +FIRST)。
有时候也写成+First,应该是一样的,属性选择器不区分大小写。
3.2.2关于input_section_pattern(怎么翻译?输入节适配器?)
input_section_pattern可以使用使用通配符*/?,这个适配器是用来找出输入节名称的,比如在程序中定义了一些输入节名称:__attribute__((section(“ram_code_1”)), __attribute__((section(“ram_code_2”)), __attribute__((section(“ram_code_3”)), 那么可以使用ram_code*作为input_section_pattern,这样就可以把所有含有ram_code的输入节名称找出来,输入节对应的内容(代码或者数据)放到指定的存储器位置。
3.2.3关于input_section_type
与输入节类型进行比较的数字。数字可以是十进制或十六进制。(干啥用的? 不知道。)
3.2.4关于input_symbol_pattern
根据全局符号确定匹配内容。
3.2.5关于section_properties
Section_properties 可以是+FIRST、+LAST和OVERALIGN值。
四、输入节举例
五、加载文件在map文件中的体现
我们可以在MDK编译后的map文件中,清晰看到分散加载文件相关的内容。