本文讲述了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.celfloader_compat.c调用它。

2.2 cmod

[5][6]声明实现了cmod_loadcmod_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

本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2022-03-20 22:53

results matching ""

    No results matching ""