vxworks 符号表 详解

时间:2021-11-11 06:05:41

vxworks符号表,又称内核符号表(kernel symbol table),其中存储了程序中各个模块的函数、变量和常量信息(还包括shell创建的变量)。符号表包括两种类型,系统符号表用户符号表

 

系统符号表:

系统符号表包含所有全局符号的名字和地址。它在下面4个功能中会用到

1. Kernel Object-Module Loader动态加载对象文件到内核

2. Debugging Facilities(调试功能)

3. Kernel Shell(内核shell

4. WDB Target AgentWDB工具

 

系统符号表有两种类型,包括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,为自己总结,可能理解有误,仅供参考。