vxworks符号表,又称内核符号表(kernel symbol table),其中存储了程序中各个模块的函数、变量和常量信息(还包括shell创建的变量)。符号表包括两种类型,系统符号表和用户符号表。
系统符号表:
系统符号表包含所有全局符号的名字和地址。它在下面4个功能中会用到:
1. Kernel Object-Module Loader(动态加载对象文件到内核)
2. Debugging Facilities(调试功能)
3. Kernel Shell(内核shell)
4. WDB Target Agent(WDB工具)
系统符号表有两种类型,包括build-in符号表和分离符号表。
build-in符号表:
build-in符号表会将符号信息复制成代码,然后共同编译链接生成镜像。
1. makeSymTbl.tcl工具生成符号信息,并复制在symTbl.c文件的standTbl数组中,具体内容如下。
SYMBOL standTbl [92569] =
{
{{NULL}, "ACCESS_ID_TaskID", (char*) &ACCESS_ID_TaskID, 0, 0, SYM_GLOBAL | SYM_DATA},
{{NULL}, "ACCESS_Id_Cli_Init", (char*) ACCESS_Id_Cli_Init, 0, 0, SYM_GLOBAL | SYM_TEXT},
{{NULL}, "ACCESS_id_CommandInstall", (char*) ACCESS_id_CommandInstall, 0, 0, SYM_GLOBAL | SYM_TEXT},
......
{{NULL}, "zsend_ipv6_delete_multipath", (char*) zsend_ipv6_delete_multipath, 0, 0, SYM_GLOBAL | SYM_TEXT},
{{NULL}, "zstrdup", (char*) zstrdup, 0, 0, SYM_GLOBAL | SYM_TEXT},
};
全局数组standTbl类型的定义如下,包含了函数或全局变量的名字和地址,最后的type表明这是什么类型的数据:
typedef struct symbol /* SYMBOL - entry in symbol table */
{
SL_NODE nameHNode; /* hash node (must come first) */
char * name; /* pointer to symbol name */
SYM_VALUE value; /* symbol value */
SYM_REF symRef; /* Id of module, or predefined SYMREF. */
SYM_GROUP group; /* symbol group */
SYM_TYPE type; /* symbol type */
} SYMBOL;
2. symTbl.c文件被正常编译链接到vxworks镜像中,程序运行初始化时,会利用standTbl数组生成系统符号表。
分离符号表:
分离符号表被编译成单独的对象文件(vxWorks.sym文件),然后被加载到内存中。
shell查找符号表:
通过lkup函数或symShow函数可以在shell中查找符号(symLib库中定义相关函数):
-> lkup "moduleShow"
moduleShow 0x004b2c7c text
moduleShowInit 0x004b2a14 text
value = 0 = 0x0
-> symShow sysSymTbl,"moduleShow"
moduleShowInit 0x004b2a14 text
moduleShow 0x004b2c7c text
value = 0 = 0x0
用户符号表:
为了安全,用户自定义的符号可以不放在系统符号表中,而是创建一个用户符号表,放在其中。symTblCreate函数可以创建一个符号表,相关的信息参考symLib库的定义。
本文参考官方文档《vxworks kernel shell users guide 6.9》第四章Kernel Symbol Table,为自己总结,可能理解有误,仅供参考。