VxWorks上符号表(symbol,symTbl)实现分析,链式哈希表

在编译VxWorks倒数第二步的时候是调用makeSymTbl.tcl脚本生成symTbl.c文件
symTbl.c定义了2个变量standTbl和standTblSize,
下面是symTbl.c的一部分,

/* symTbl.c - standalone symbol tables wrapper */
/* CREATED BY C:/WindRiver/vxworks-6.9/host/resource/hutils/tcl/makeSymTbl.tcl
 *  WITH ARGS arm tmp.o symTbl.c
 *         ON Wed Jun 06 14:41:54 +0800 2018
 */
#include "vxWorks.h"
#include "symbol.h"

IMPORT int zynq7kGemRegister ();
IMPORT int zynq7kI2cDevRegistration;
IMPORT int zynq7kI2cRead ();
IMPORT int zynq7kI2cRegister ();
IMPORT int zynq7kI2cShow ();
IMPORT int zynq7kI2cWrite ();

SYMBOL standTbl [7597] =
    {
        {{NULL}, "CQ", (char*) &CQ, 0, 0,  SYM_GLOBAL | SYM_BSS},
        {{NULL}, "CQ_IN", (char*) CQ_IN, 0, 0,  SYM_GLOBAL | SYM_TEXT},
        {{NULL}, "CQ_OUT", (char*) CQ_OUT, 0, 0,  SYM_GLOBAL | SYM_TEXT},
        {{NULL}, "CQ_create", (char*) CQ_create, 0, 0,  SYM_GLOBAL | SYM_TEXT},


        {{NULL}, "zynq7kGemMacHashCalc", (char*) zynq7kGemMacHashCalc, 0, 0,  SYM_GLOBAL | SYM_TEXT},
        {{NULL}, "zynq7kGemRegister", (char*) zynq7kGemRegister, 0, 0,  SYM_GLOBAL | SYM_TEXT},
        {{NULL}, "zynq7kI2cDevRegistration", (char*) &zynq7kI2cDevRegistration, 0, 0,  SYM_GLOBAL | SYM_DATA},
        {{NULL}, "zynq7kI2cRead", (char*) zynq7kI2cRead, 0, 0,  SYM_GLOBAL | SYM_TEXT},
        {{NULL}, "zynq7kI2cRegister", (char*) zynq7kI2cRegister, 0, 0,  SYM_GLOBAL | SYM_TEXT},
        {{NULL}, "zynq7kI2cShow", (char*) zynq7kI2cShow, 0, 0,  SYM_GLOBAL | SYM_TEXT},
        {{NULL}, "zynq7kI2cWrite", (char*) zynq7kI2cWrite, 0, 0,  SYM_GLOBAL | SYM_TEXT},

    };
ULONG standTblSize = 7597;

注意standTbl 表的第一个字段的内容都是NULL!!!!
下面一个函数显示了运行时standTbl 的内容

void tblShow(void)
{
    ULONG i;
    for(i=0;i<standTblSize;i++)
    {
        printf("[%d:%p]:0x%08x\t0x%08x\t0x%08x\t0x%08x\t0x%08x\t0x%08x\t\n",i,&standTbl[i],standTbl[i].nameHNode.next,
                standTbl[i].name,standTbl[i].value,standTbl[i].symRef,standTbl[i].group,standTbl[i].type);
    }
}

运行结果:这里写图片描述

从图上可以看到standTbl中原本为NULL的字段变成了具体的值!
看下SYMBOL的定义

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;

可以看到第一个字段是singly linked list指针,那么是什么时候给指针赋值的呢?symTblAdd

symTblCreate创建哈希表
symTblAdd遍历standTbl表吧每个元素添加到哈希表里。
最终生成如下的链式哈希表

总结,生成符号表需要2步
1生成symTbl.c文件
2生成hash表,修改nameHNode值
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ambercctv/article/details/80595910