本文讲述了Contiki\core\loader\目录下的文件关系,理清这些关系,有助于移植、应用开发。
1. 文件清单
[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. 详情说明
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].
[2] 本博文的TXT格式文件:contiki_loader_list.txt