本帖最后由 xinzha 于 2011-1-6 21:14 编辑
5.2.6 解决多重匹配
如果一个输入段跟多个执行区域匹配,匹配问题就如以下所描述方式解决。然而如果不能找到一个唯一的匹配,链接器就会认为分散加载描述失效。每个输入段通过module_select_pattern和input_section_selector来选择。
module_select_pattern定义如下:
1、*匹配任意模块或者库
2、*.o匹配任意目标模块
3、math.o匹配math.o模块
4、*armlib*匹配所有ARM提供的库
5、*math.lib匹配任意路径下的文件末尾是math.lib的库(例如C:\apps\lib\math\satmath.lib)。
input_section_selector定义如下:
1、+RO是匹配所有RO代码和RO数据的输入模块属性
2、+RW,+ZI是匹配所有RW代码和RW数据以及ZI数据的输入模块属性。
3、BLOCK_42是匹配所有汇编文件内定义为BLOCK_42域的输入段模板
注意事项:编译器会生成能够被输入模块模板识别的域,比如.text,.data,.constdata和.bss。这些名字在将来也许会被改变,所以要避免使用它们。
如果你想从一个C或C++匹配一个特定的函数或者外部数据,需要如下操作:
1、将此函数或数据在一个独立的模块中编译并匹配这个模块目标文件名
2、使用#pragma arm section或者__attribute__来指定你那个包含你想要的函数或者数据的输入段。参见《RealView Compilation Tools v3.0》中描述ARM编译器的章节。
下面的变量用来描述多重匹配:
1、m1和m2表示5模块选择模板
2、s1和s2表示输入模块选择符
在多重匹配的情况下,链接器根据module_select_pattern和input_section_selector对的优先级来决定将输入段分配给哪个执行区域。
例如输入段A匹配执行区域R1的m1和s1,同时也匹配执行区域R2的m2和s2,链接器判断如下:
1、如果m1,s1优先级高,就将A分配给R1
2、如果m2,s2优先级高,就将A分配给R2
3、若优先级相同,链接器认为分散加载描述非法。
armlink判断module_select_pattern,input_section_selector对的优先级顺序如下:
1、对于模块选择模板:
如果m1匹配m2,但是m2不能匹配m1,那么m1的优先级高于m2。
2、对于输入段选择符:
一、如果s1和s2都是匹配输入段名字的模板,那么就使用类似于模块选择符的方式决定。
二、如果s1和s2中的一个匹配输入段名字,另外一个匹配输入段属性,认为描述失效。
三、如果s1和s2都匹配输入段属性,判断谁优先级更高的原则如下:
I、ENTRY比RO-DATA,RO-CODE,RW-DATA,RW-CODE优先级更高。
II、RO-DATA,RO-CODE的优先级高于RO。
III、RW-CODE和RW-DATA的优先级高于RW。
3、对于module_select_pattern,input_section_selector对来说,如果一下任意条件为真,则m1,s1的优先级高于m2,s2:
1、s1是字母形式的输入段名(不包含模板符号),s2是匹配除+ENTRY之外的输入段属性。
2、m1优先级高于m2
3、s1优先级高于s2
匹配策略有如下顺序:
1、并不依赖于它们在文件中书写的次序。
2、通常来说,目标文件描述符优先级高,那么它所包含的输入段优先级也高。
3、除非发生如下情况,否则不检查input_section_selectors:
一、目标文件选择是非决定性的。
二、一个选择符是输入段全名,而其他的是通过属性选择。这种情况下,全名的优先级高于属性(除非是ENTRY),将从一个目标文件中选择相对应的输入段。即使输入段名选择符相应的目标文件选择符优先级低于属性相应的目标文件选择符,也要按照这种规则操作。 |