VxWorks 符号表

符号表初始化
          符号表用于建立符号名称、类型和值之间的关系。其中,名称为null结尾的任意字符串;类型为标识各种符号的整数;值为一个字符指针。符号表主要用来作为目标模块加载的基础,但在需要名称和值关联的任何时候都看使用。

          运行系统中一般存在两个符号表结构sysSymTbl和statSymTbl。sysSymTbl为目标机的系统符号表,通过程序或tShell动态加载的目标模块的符号模块的符号都添加到该符号表中,sysSymTbl和statSymTbl两个标识本身页包含在该系统符号表中。statSymTbl中包含errno的信息,若相在tShell中使用printErrno命令,就必须包含该符号表。

         主机的Target Server只使用一个符号表,看通过全局变量tgtSymTbl访问。

         vxWorks中符号表函数库symLib,提供用于符号表操作的相关函数。系统符号表允许同名冲突,同名符号回加入符号表而不报错,当引用符号时,系统缺省使用symFindByName查找,所以最新加入的符号总会先找到,代替老符号完成引用。同名符号的存在还带来另一个问题,不能确保查找到的符号是自己加载模块的,即不能保证group号。主机symlib库中函数用于维护主机符号表tgtSymTbl。

          vxWorks的符号表与编译器的符号表吧同,vxWorks的符号表时动态存在系统中的,由symLib提供的函数进行维护,在运行过程中可以增加和删除符号,主要用于目标模块的动态加载,与目标模块的格式无关。而编译器中的符号表时静态的,由编译器和连接器在建立程序映像时生成并使用,主要用于符号的静态解析,帮助建立映像,它们的格式和目标类型有关。交叉调试器中源代码调试,页时由静态符号表支持的,这种符号表占用很大的程序映像空间,当程序发布时,可以去掉(不使用 -g 选项)。

        vxWorks需要主机工具在映像生成时完成一些准备工作来建立系统符号表,sysSymTbl和statSymTbl对应两个主机工具makeSymTbl.exe和makeStatTbl.exe,用于生成符号数组以编译进入程序映像。工具makeSymTbl.exe用于创建包含SYMBOL类型数组的symTbl.c文件,包含目标模块中所有全局符号的名称、地址和类型,该全局数组名称为standTbl,其大小为standTblSize,存放在程序映像的data段中。工具makeStatTbl.exe用于创建状态代码SYMBOL数组,包含一些头文件中定义的所有状态代码的名称和值,所有状态代码以“S-”开头,一般库头文件中都有这样的定义。,该全局数组名成为statTbl,其大小为statTblSize,statSymTbl主要由printErrno函数使用,也可以由应用程序使用,输出确定意义的状态信息,存放在程序映像的data段中。

         符号表初始方式有build-in和downloaded两种方式,使用内建符号表时,符号时Vxworks程序映像的一部分;下载符号表则和VxWorks映像分离,由目标机单独下载Sym文件获得符号。若使用下载符号表,使用主机工具xsym,生成符号模块文件VxWorks.sym,该文件和普通目标模块一样,只是没有data和bss段,下载到目标机后,和普通目标模块一样动态加载,模块中的符号会添加到系统符号表。

         目标机符号表时完成动态加载、连接,以及调试的辅助机制,映像有没有符号表都不影响程序正常运行,调试时,只要不从目标机上动态加载目标模块,程序映像符号都静态连接解析,目标机上也可以没有符号,主机开发工具都使用主机符号表tgtSymTbl来完成交叉调试。

      符号表同步

         主机和目标机使用不同的符号表,在主机上使用的各种工具并不能访问目标机上所有的内容,工具都是通过主机上Target Server和目标机上Target Agent进行通信的,主机和目标机都不能直接访问对方的符号信息。主机和目标机都维护着自己的符号表,当添加符号时,将符号加入到其中一个表中,在wShell上添加的符号到了主机符号表,而tShell上添加的符号就到了目标机符号表中,缺省时两个表互不共享,可以通过添加符号表同步组件------INCLUDE_SYM_TBL_SYNC,这样符号会在主机和目标机之间福祉,两符号表会同步更新。

          主机和目标机使用不同的符号表,系统启动时两个符号表的内容是一样的,当动态加载目标模块后,两个符号表就不一致了,从wShell中加载目标模块后,却想从tShell引用该模块符号,或者从tShell加载后,想用主机工具调试该模块,因为wShell或tShell都看不见对方加载的模块,可能出现下面错误:

           Error:module contains undefined symbol

           Unresolved symbol

           Fatal Error: unresolvable symbol

         要解决此问题就需要使用符号表同步机制,Vxworks提供了symSyncLib库来完成符号表同步,系统运行中,从主机或目标机添加的符号都可以被对方看见,symSyncLib会在目标机创建同步任务tSymSyc,该任务被当作WTX工具与主机的Target Server相连,任务启动时,会立即同步符号表。如果不再需要同步符号表,可以手动将tSymSync悬挂起来,以提高目标机性能。

     

       错误状态

          若VxWorks库函数执行出现问题,函数会返回ERROR值,并设置错误状态表示具体的原因和位置。

          错误状态库errnoLib用于获取和设置任务和中断的错误状态值errno,VxWorks每个任务和中断都有自己的errno,任务的errno存放在TCB中,为任务私有,中断的errno存放在中断栈中,只要字啊中断处理函数中errno都有效。

         VxWorks的errno值由4byte构成,高字表明发生错误的库,各库对应的值在“taget/h/vwModNum.h”中定义,低字表示该库发生的具体错误,在相应库的头文件中定义。约定VxWorks系统模块使用高字值,范围为1~500,其他值可以由应用模块使用,对低字值没有规定。

         usrLib提供printErrno函数来显示具体错误信息,printErrno根据输入的errno值,在statSymTbl中查找到对应的错误信息,并显示在标准输出上。

         ----> printErrno 0xd0003

         0xd0003 = S_iosLib_INVALID_FILE_DESCRIPTOR

         "S_"表示状态,iosLib为发生错误的库名称,INVALID_FILE_DESCRIPTOR表示该库具体的错误。

         若想在tShell或程序中调用printErrno来显示错误信息,程序映像中需包含错误代码组件---INCLUDE_STAT_SYM_TBL ,以在目标机建立statSymTbl。‘

         如果不能使用printErrno,也可以手动查找头文件得到错误信息,比如“d0003”,先在vwModNum.h查找“d”对应的库,“d”换算成十进制“13”,查到M_iosLib:              #define M_iosLib        (13 << 16)

         再到iosLib库自己的头文件iosLib.h中查找具体错误,其中“0003”对应的宏定义为:

           # define S_iosLib_INVALID_FILE_DESCRIPTOR     (M_iosLIb | 3)

          这个宏定义名就是用户要知道的错误信息。

时间: 2024-09-11 07:24:58

VxWorks 符号表的相关文章

linux内核符号表kallsyms简介

在使用perf排查问题时,我们经常会发现[kernel.kallsyms]这个模块.这到底是个什么东西呢? 简介: 在2.6版的内核中,为了更方便的调试内核代码,开发者考虑将内核代码中所有函数以及所有非栈变量的地址抽取出来,形成是一个简单的数据块(data blob:符号和地址对应),并将此链接进 vmlinux 中去. 在需要的时候,内核就可以将符号地址信息以及符号名称都显示出来,方便开发者对内核代码的调试.完成这一地址抽取+数据快组织封装功能的相关子系统就称之为 kallsyms. 反之,如

可配置语法分析器开发纪事(二) 构造符号表

上一篇博客讲到了构造语法树的问题.有朋友在留言问我,为什么一定要让语法分析器产生语法树,而不是让用户自己决定要怎么办呢?在这里我先解答这个问题. 1.大部分情况下都是真的需要有语法树 2.如果要直接返回计算结果之类的事情的话,只需要写一个visitor运行一下语法树就好了,除去自动生成的代码以外(反正这不用人写,不计入代价),代码量基本上没什么区别 3.加入语法树可以让文法本身描述起来更简单,如果要让程序员把文法单独放在一边,然后自己写完整的语义函数来让他生成语法树的话,会让大部分情况(需要语法

浅谈算法和数据结构 六 符号表及其基本实现

前面几篇文章介绍了基本的排序算法,排序通常是查找的前奏操作.从本文开始介绍基本的查找算法. 在介绍查找算法,首先需要了解符号表这一抽象数据结构,本文首先介绍了什么是符号表,以及这一抽象数据结构的的API,然后介绍了两种简单的符号表的实现方式. 一符号表 在开始介绍查找算法之前,我们需要定义一个名为符号表(Symbol Table)的抽象数据结构,该数据结构类似我们再C#中使用的Dictionary,他是对具有键值对元素的一种抽象,每一个元素都有一个key和value,我们可以往里面添加key,v

手把手教你写脚本引擎(五)——简单的高级语言(3,符号表)

符号表的结构的复杂度跟语言的语义规则的复杂度有关.对于C#来说,每一个符号都附带了一大堆信息,譬如位置啦,所在的namespace啦,类型啦什么的.对于JavaScript来说,符号表几乎是不需要的,因为东西都动态了,编译时几乎不检查内容.语义分析的输出是符号表,代码生成的输入是符号表和语法树.因此语法树除了放语法相关的内容,语义相关的内容最好放到符号表里面(譬如说表达式的类型啦,语句的scope结果啦).关于一个现实中的符号表组织可以看CMinus的语义分析结果. 首先我们要解决类型的表达问题

QQ输入法手机版S60V2/V3S数字键盘如何打开符号表

  QQ输入法手机版S60V2/V3S数字键盘打开符号表的方法如下: 通过短按*键进入符号界面,进入符号界面后的操作: 短按*键:进行符号表内类别的切换. 长按*键:进行符号表的常规模式和行列模式的切换. 常规模式:通过方向键选择目标符号. 行列模式:通过数字键选择目标符号. 按#键:进行当前符号表的翻页. 左软键:进行锁定(或解锁)符号表,锁定状态时符号表右上角出现锁定符号.(说明:每次开打符号表时,默认为非锁定状态.通过左软键键后,即可锁定.锁定后可以连续输入多个符号,再左软键后,即可解锁)

QQ输入法手机版如何打开符号表

  QQ输入法手机版打开符号表的方法如下: [Symbian S60 V2V3平台] 九宫格键盘手机--通过短按[*]键打开符号表.打开符号表后,继续短按[*]键或者通过方向键进行不同类别符号表的轮换切换;通过短按[#]键进行锁定(或解锁)符号表. 全键盘手机--通过短按[Chr]键打开符号表.打开符号表后,继续短按[Chr]键进行不同类别符号表的轮换切换;通过短按[shift]键进行锁定(或解锁)符号表. 锁定符号表后,符号表右上角会出现"锁"的小图标,表示此时可以连续输入多个符号,

iOS符号表恢复&amp;逆向支付宝

推荐序 本文介绍了恢复符号表的技巧,并且利用该技巧实现了在 Xcode 中对目标程序下符号断点调试,该技巧可以显著地减少逆向分析时间.在文章的最后,作者以支付宝为例,展示出通过在 UIAlertView 的 show 方法处下断点,从而获得支付宝的调用栈的过程. 本文涉及的代码也开源在:https://github.com/tobefuturer/restore-symbol,欢迎 Star 和提 Issue.感谢作者授权发表. 作者介绍:杨君,中山大学计算机系研究生,iOS 开发者,擅长领域

符号表在编译结束后会怎样?会被保存吗?

问题描述 符号表在编译结束后会怎样?会被保存吗? 我是个新手,想大家指导一下. 1.符号表是在编译开始后建立的吗? 2.编译结束后,符号会怎样?会被保存吗? 解决方案 符号表在词法分析的时候被建立,编译完成,可以保留(如果希望编译的结果另外有用途,就保留),也可以丢弃. 解决方案二: 符号表是在编译开始后建立的吗 - 编译分前端和后端,前端分词法分析,语法分析.词法分析就把符号表建立了. 编译结束后,符号会怎样?会被保存吗?-符号表在某些阶段非常有用,比如debug,所以在debug版本里面,符

GDB如何调试没有符号表(未加-g选项的编译)的程序

/********************************************************************* * Author  : Samson * Date    : 01/30/2015 * Test platform: *              3.13.0-24-generic *              GNU bash, 4.3.11(1)-release  * *****************************************