二进制翻译中经由跳转表的多目标分支语句的识别方法技术

技术编号:2845877 阅读:234 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种二进制翻译中经由跳转表的多目标分支语句的识别方法,包括:1)把要识别的语义转化为语义图,该语义图作为模板图;2)选择待识别语义的代码片段;3)将代码片段按照语义构建语义图;4)将步骤3)构建出的语义图和步骤1)得到的模板图做匹配,若匹配成功,则识别出语义,执行下一步,否则所选择的代码片段语义识别失败;5)获取跳转表的地址和大小,进而得到表项中记录的分支目标地址,标记其为有效代码。本发明专利技术的优点在于:扩大了二进制翻译中静态翻译阶段的翻译覆盖率,提高了代码的执行效率;可以应用于多种平台下的二进制文件分析中,适用范围广;在解决识别经由跳转表的多目标分支语句问题上算法简练,易于实现。

【技术实现步骤摘要】

本专利技术涉及计算机领域内的翻译技术,特别涉及到静态二进制翻译中经由跳转表的多目标分支语句的识别。
技术介绍
二进制翻译技术是目前解决软件移植问题的一个研究热点,能将现有的软件移植到新开发的处理器上执行,对促进处理器体系结构的发展和国产微处理器的推广具有重要意义。对于采用静态方式或动静结合方式进行的二进制翻译系统来说,静态翻译阶段需要对被翻译的二进制文件进行分析和翻译,而文件中并非所有的数据都是有实际意义的,其中可能包括为了满足页对齐要求而引入的一些填充数据。在二进制翻译时,静态翻译阶段需要尽可能多地对有效代码进行识别,并对其进行翻译和优化,以形成性能较好的目标机的二进制代码(静态本地码)。但静态翻译阶段只有确定可以到达的代码是有效的,比如各个函数的入口地址处的指令(记录在ELF文件的符号表中),跳转指令的目标地址处的指令,分支指令的下一条指令(fall through)以及目标地址处的指令(target)等等,这些都是可以静态时分析出来的。但是对于间接跳转和间接调用指令(如jmp*%eax,call*%eax),目标地址需要在动态运行时从寄存器或存储单元中取出,静态翻译阶段无法得到,从而无法对他们的目标地址处的有效代码进行翻译。间接跳转指令,如jmp*%eax,代表了一种多目标分支语句,即跳转的目标有多个,具体跳转到哪个目标在动态运行阶段确定。间接跳转指令的典型代表是高级语言中的switch-case语句,switch-case语句在实际的程序中大量存在,如果能在静态翻译阶段把所有的跳转目标处的代码识别出来并进行翻译将有助于提高代码的执行效率。以C语言为例,典型的switch-case语句可表达为 switch(expr){case value1: code1;break; case value2: code2;break; case value3: code3;break; case...... default: code_default; }其中,<expr>称为待匹配的表达式,<value1>,<value2>,<value3>为候选值,当<expr>的值与某一个候选值相等时,执行相应目标处的代码(即<code1>,<code2>或<code3>)。编译器对switch-case语句的实现主要有以下几种方式1、顺序比较表达式的值和每一个候选值,若表达式的值与某一个候选值相等,转到相应的分支入口处。该方式常用于候选值数目较少的情况下。编译出的目标码结构为cmpvalue1,exprje code1_addrcmpvalue2,exprje code2_addrcmpvalue3,exprje code3_addrjmpcode_default_addrcode1_addr:code1code2_addr:code2code3_addr:code3code_default_addr:code_default2、将候选值组织成搜索树的结构,提高查找速度(如折半查找)。常用于候选值数目较多且分布较为稀疏的情况下。对于上例,若value1<value2<value3,则先比较<expr>与<value2>,然后比较<expr>与<value1>以及<expr>与<value3>。3、使用跳转表。跳转表中的每个表项存放的是一个候选值对应的分支入口地址,使用跳转表时,将表达式<expr>的值转化成跳转表的索引,从而可以立即找到相应的表项。常用于候选值数目较多且分布较为集中的情况下。它的目标码结构为index←f(expr);注释将<expr>的值转化成跳转表的索引jmp*Table_Base(index×4); 注释Table_Base是跳转表的起始地址,每个表项占4个字节,则Table_Base+index×4为跳转表第index项的地址。如下面的表1所示,为跳转表的一个示例,表1 Table_Base从上表可以看到,跳转表不一定是按每个分支代码的入口地址顺序排放,其间某个表项可能是code_default代码的地址,因为value的分布不一定是连续的,在上表中,<value2>和<value3>就不连续。4、使用哈希(hash)表。hash表的每个表项也是存放一个候选值对应的分支入口地址。通过计算表达式<expr>的hash值,也可以较快地得到相应的表项。该方法常用于候选值数目较多且分布稀疏的情况。在实际使用中,该方法使用较少。对于前两种方式,很容易从指令中得到跳转的目标地址,进而可以对code1,code2,code3,code_default这些代码进行识别和翻译,但对于第三种方式,一般需要通过一条间接跳转指令才能跳到相应的表项处,在静态翻译阶段很难直接得到指令的目标地址,不利于翻译效率的提高。第四种方式使用的较少,本专利技术不做处理。
技术实现思路
本专利技术的目的是克服现有技术在静态翻译阶段很难直接得到指令目标地址的缺点,提供一种,实现在静态翻译阶段对跳转表的位置和内容的分析,从而获得各个专业分支的目标地址。为了实现上述目的,本专利技术提供了一种,包括1)把要识别的语义转化为语义图,把转化后的语义图作为模板图; 2)选择待识别语义的代码片段;3)将步骤2)选择出的代码片段按照语义构建语义图;4)将步骤3)构建出的语义图和步骤1)得到的模板图做匹配,若匹配成功,则识别出语义,执行下一步,否则所选择的代码片段语义识别失败;5)获取跳转表的地址和大小,进而得到表项中记录的分支目标地址,标记其为有效代码。上述技术方案中,所述的步骤2)包括2-1、在代码中查找间接跳转指令,当遇到该指令时,向前查看一定数量的指令;2-2、在向前查找的指令中,看是否有比较指令,若有比较指令,则将比较指令与间接跳转指令之间的代码段作为要识别的代码片段;若没有找到比较指令,则不做处理。上述技术方案中,所述的步骤3)中,在构建语义图时需要引入一个记录操作数的队列,该队列记录语义图构建过程中所有已经出现过的操作数以及该操作数的最新值在语义图中对应的节点。上述技术方案中,所述的步骤4)中,对待检测的语义图和模版图进行同步的遍历,检测两个图中对应位置的节点是否相匹配,两图中所有对应位置的节点均匹配则认为两个图是匹配的。上述技术方案中,所述的步骤4)中,将语义图和模板图的节点分为三种类型分支节点、运算符节点、原子操作数节点,分支节点视为整个语义图的根节点,从该节点开始对语义图进行匹配检测,对于不同类型的节点,分别按不同的规则进行匹配检测4-1、分支节点,依次检测它的三棵子树是否与模版本文档来自技高网
...

【技术保护点】
一种二进制翻译中经由跳转表的多目标分支语句的识别方法,包括:1)把要识别的语义转化为语义图,把转化后的语义图作为模板图;2)选择待识别语义的代码片段;3)将步骤2)选择出的代码片段按照语义构建语义图;4)将步 骤3)构建出的语义图和步骤1)得到的模板图做匹配,若匹配成功,则识别出语义,执行下一步,否则所选择的代码片段语义识别失败;5)获取跳转表的地址和大小,进而得到表项中记录的分支目标地址,标记其为有效代码。

【技术特征摘要】
1.一种二进制翻译中经由跳转表的多目标分支语句的识别方法,包括1)把要识别的语义转化为语义图,把转化后的语义图作为模板图;2)选择待识别语义的代码片段;3)将步骤2)选择出的代码片段按照语义构建语义图;4)将步骤3)构建出的语义图和步骤1)得到的模板图做匹配,若匹配成功,则识别出语义,执行下一步,否则所选择的代码片段语义识别失败;5)获取跳转表的地址和大小,进而得到表项中记录的分支目标地址,标记其为有效代码。2.根据权利要求1所述的二进制翻译中经由跳转表的多目标分支语句的识别方法,其特征在于,所述的步骤2)包括2-1、在代码中查找间接跳转指令,当遇到该指令时,向前查看一定数量的指令;2-2、在向前查找的指令中,看是否有比较指令,若有比较指令,则将比较指令与间接跳转指令之间的代码段作为要识别的代码片段;若没有找到比较指令,则不做处理。3.根据权利要求1所述的二进制翻译中经由跳转表的多目标分支语句的识别方法,其特征在于,所述的步骤3)中,在构建语义图时需要引入一个记录操作数的队列,该队列记录语义图构建过程中所有已经出现过的操作数以及该操作数的最新值在语义图中对应的节点。...

【专利技术属性】
技术研发人员:陈龙唐锋谢海斌杨浩
申请(专利权)人:中国科学院计算技术研究所
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1