==================================== =contiki/core/loader/文件清单如下:= ==================================== [1]cle.h ——Contiki动态链接编辑器(dynamic Link Editor)头文件 [2]cle.c ——Contiki动态链接编辑器实现 [3]cle_avr.c ——avr平台的Contiki动态链接编辑器实现 [4]cle_msp430.c ——msp430平台的Contiki动态链接编辑器实现 [5]cmod.h ——cmod头文件 [6]cmod.c ——cmod实现 [7]elf32.h ——elf文件定义了结构体:文件头、段描述符(段表的项)、重定位表、符号(符号表的项) [8]dlloader.h ——动态加载头文件 [9]dlloader.c ——动态加载实现(dlloader_load) [10]elfloader-arch.h ——硬件相关的ELF loader头文件 [11]elfloader-avr.c ——avr平台的ELF loader底层实现 [12]elfloader-msp430.c ——msp430平台的ELF loader底层实现 [13]elfloader-stub.c ——桩平台(其他平台实现的模板)的ELF loader底层实现 [14]elfloader-x86.c ——x86平台的ELF loader底层实现 [15]elfloader.h ——通用的ELF loader头文件(包括链接、重定位、加载) [16]elfloader.c ——通用的ELF loader实现 [17]elfloader_compat.h ——与elfloader.c相兼容的elfloader头文件 [18]elfloader_compat.c ——与elfloader.c相兼容的elfloader实现 [19]sym.h ——符号头文件(比symbols.h更具体) [20]sym.c ——符号实现(比symbols.h更具体) [21]symbols.h ——符号头文件(定义符号结构体) [22]symbols-def.h ——符号头文件(定义符号结构体) [23]symtab.h ——符号表头文件 [24]symtab.c ——符号表查找实现(symtab_lookup) [25]symtab-avr.c ——avr平台符号表查找实现 二、详情说明 2.1 动态链接编辑器 [1]~[4]是Contiki动态链接编辑器(dynamic Link Editor)声明及实现,也只有cmod.c及elfloader_compat.c调用它。 2.2 cmod [5][6]声明实现了cmod_load、cmod_unload函数,没找到Contiki源码哪里调用了这两个函数,源码也没注释,不晓得是什么意思,难道是Contiki module? 2.3 elf32.h [7]定义了ELF文件头相关结构体,而这些定义在elfloader.c也定义了,直接include "elf32.h"不就完了吗,真是多此一举。 2.4 dlloader [8][9]动态加载dlloader_load函数声明及实现。 2.5 硬件相关elfloader 考虑到不同处理器的ELF格式轻微不同,Contiki将ELF loader分成两部分:硬件相关和通用,硬件相关给通用的提供接口。硬件相关完成内存分配、代码和数据重定位、ELF代码写回程序存储器。将Contiki移植到新处理器(Contiki 2.5已支持avr、msp430、x86、arm,有的在core/loader,有的在cpu/arm/),需要实现elfloader-arch.h的函数。底层elfloader-arch.c为上层通用elfloader(elfloader.c)提供接口。 2.6 通用elfloader [15][16]是通过ELF loader声明及实现,包括链接、重定位、加载,也是给上层应用提供的接口。[17][18]实现的功能与[15][16]类似,声称是与elfloader.c兼容,源代码注释如下: This code is plug-in compatible with elfloader.c and is an example of how the Contiki dynamic Link Editor (CLE) can be used. 2.7 符号表 ELF文件中的符号表往往是文件中的一个段,段名一般叫.symtab[1]。符号表是由符号结构体组成的一个数组,Contiki符号只有两个属性(名和值)。 [21][22]内容完全一样,定义了符号的结构体,相对于Linux的ELF简单多了,只有两个成员(符号名和符号对应的值),在loader/systab.c使用。[19][20]也是符号相关的一些定义,但比symbols.h更具体,差别在于,symbols.h只是将符号的值简单定义为void型指针(void *value),而sym.h将符号值定义为联合体:对象指针或者函数指针。除此之外,sym.h还提供符号查找、对象指针与函数指针转换功能。[23][24][25]仅仅是符号表查找函数声明及定义。 从代码来看,[19][20]与[21]~[25]实现的功能类似,都是符号结构体定义、符号查找。 参考资料: [1]《程序员的自我修养——链接、装载与库》[M]. ========================= Author:Jelline E-mail:Jelline@126.com Date:2012-04-10 =========================