我是靠谱客的博主 彪壮长颈鹿,最近开发中收集的这篇文章主要介绍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%08xt0x%08xt0x%08xt0x%08xt0x%08xt0x%08xtn",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值
这里写图片描述

最后

以上就是彪壮长颈鹿为你收集整理的VxWorks上符号表(symbol,symTbl)实现分析,链式哈希表的全部内容,希望文章能够帮你解决VxWorks上符号表(symbol,symTbl)实现分析,链式哈希表所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(90)

评论列表共有 0 条评论

立即
投稿
返回
顶部