符号表初始化
符号表用于建立符号名称、类型和值之间的关系。其中,名称为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)
这个宏定义名就是用户要知道的错误信息。
- C/C++编译和链接过程详解 (重定向表,导出符号表,未解决符号表)
详解link 有 些人写C/C++(以下假定为C++)程序,对unresolved external link或者duplicated external simbol的错误信息不知所措(因为这样的错 ...
- ELF Format 笔记(七)—— 符号表
最是那一低头的温柔,像一朵水莲花不胜凉风的娇羞,道一声珍重,道一声珍重,那一声珍重里有蜜甜的忧愁 —— 徐志摩 ilocker:关注 Android 安全(新手) QQ: 2597294287 符号表 ...
- IDA 与VC 加载符号表
将Windbg路径下的symsrv.yes 拷贝到ida 的安装目录,重新分析ntoskrnl.exe, 加载本地的符号表 添加环境变量 变量名:_NT_SYMBOL_PATH变量值:SRV*{$P ...
- iOS 符号表恢复 & 逆向支付宝
推荐序 本文介绍了恢复符号表的技巧,并且利用该技巧实现了在 Xcode 中对目标程序下符号断点调试,该技巧可以显著地减少逆向分析时间.在文章的最后,作者以支付宝为例,展示出通过在 UIAlertVie ...
- 使用objdump objcopy查看与修改符号表
使用objdump objcopy查看与修改符号表动态库Linuxgccfunction 我们在 Linux 下运行一个程序,有时会无法启动,报缺少某某库.这时需要查看可执行程序或者动态库中的符 ...
- 符号表(Symbol Tables)
小时候我们都翻过词典,现在接触过电脑的人大多数都会用文字处理软件(例如微软的word,附带拼写检查).拼写检查本身也是一个词典,只不过容量比较小.现实生活中有许多词典的应用: 拼写检查 数据库管理应用 ...
- 符号表实现(Symbol Table Implementations)
符号表的实现有很多方式,下面介绍其中的几种. 乱序(未排序)数组实现 这种情况,不需要改变数组,操作就在这个数组上执行.在最坏的情况下插入,搜索,删除时间复杂度为O(n). 有序(已排序)数组实现 这 ...
- 程序减肥,strip,eu-strip 及其符号表
程序减肥,strip,eu-strip 及其符号表 我们要给我们生成的可执行文件和DSO瘦身,因为这样可以节省更多的磁盘空间,所以我们移除了debug信息,移除了符号表信息,同时我们还希望万一出事了, ...
- 《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅳ
3.1.4 无序链表中的顺序查找 符号表中使用的数据结构的一个简单选择是链表,每个结点存储一个键值对,如以下代码所示.get()的实现即为遍历链表,用equals()方法比较需被查找的键和每个节点中的 ...
随机推荐
- 《Thinking in Java》学习笔记(一)
服务器端的编程可以参考另一本书<企业Java编程>(Thinking in Enterprise Java). 1.基本类型 基本型别 大小 最小值 最大值 默认值 boolean -- ...
- 洛谷4月月赛R2
洛谷4月月赛R2 打酱油... A.koishi的数学题 线性筛约数和就可以\(O(N)\)了... #include <iostream> #include <cstdio> ...
- Uva 11077 Find the Permutations [置换群 DP]
题意: 给定$n$和$k$,问有多少排列交换$k$次能变成升序 $n \le 21$ $uva$貌似挂掉了$vjudge$上一直排队 从某个排列到$1,2,...,n$和从$1,2,...,n$到某个 ...
- 克隆虚拟机以及两台linux机器相互登录:linux学习第四篇
克隆虚拟机 1. 克隆 之后自己命名克隆的虚拟机并自己选择存放位置,完成克隆 2. 克隆虚拟机之后对新的虚拟机修改网络配置,以免冲突(将配置文件里的UUID去掉,并修改IP地址) ...
- Hadoop源码分类概要整理
最近突然觉得, 很多掌握的都还是很浅的原理,需要更深入细粒度去了解整个分布式系统的运转机制.于是..开始作死而又作死而又作死的源码之旅. Hadoop包的功能总共有下列几类: tool:提供一些命令行 ...
- 观察者模式—jdk自带源码分析
一:观察者模式简介 二:jdk实现观察者模式的源码 三:实际例子 四:观察者模式的优点和不足 五:总结 一:观察者模式简介 有时又被称为发布(publish )-订阅(Subscribe)模式.模型- ...
- ASP.NET Core 2.0 : 五.服务是如何加载并运行的, Kestrel、配置与环境
"跨平台"后的ASP.Net Core是如何接收并处理请求的呢? 它的运行和处理机制和之前有什么不同? 本章从"宏观"到"微观"地看一下它的 ...
- tpframe框架之slide模块的使用
最新版git:https://gitee.com/37duman/tpframe 下载插件 点击下载slide插件 安装插件 把下载下来的插件解压后放置在addon文件夹 登录后台,点击插件管理 点击 ...
- 进入Docker容器
在进入Docker容器之前,首先要运行对应的Docker容器,先使用命令docker ps查看正在运行的容器. docker inspect --format='{{.NetworkSettings. ...
- 剑指offer第八天
32.把数组排成最小的数 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323 ...