基于QEMU的跨平台静态二进制翻译系统

2016-12-12 02:57:30卢帅兵庞建民
浙江大学学报(工学版) 2016年1期
关键词:函数调用基本块二进制

卢帅兵,庞建民,单 征,岳 峰

(解放军信息工程大学 数学工程与先进计算国家重点实验室, 河南 郑州 450001)



基于QEMU的跨平台静态二进制翻译系统

卢帅兵,庞建民,单 征,岳 峰

(解放军信息工程大学 数学工程与先进计算国家重点实验室, 河南 郑州 450001)

为了实现快速映射间接分支目标地址,提出地址索引映射表法,使用地址数组按源地址顺序保存所有对应的目的地址,索引数组存储源地址在地址数组中的索引位置,只需要几条指令就可以完成源地址到目的地址的映射,提高了执行速度.为了加快函数的调用处理,提出将本地栈作为影子栈、与本地库函数封装相结合的方法.本地栈模拟参数传递和返回,加速函数调用.结合封装接口处理参数和返回值,实现间接调用本地库函数,提高了函数处理能力.基于上述方法和QEMU,设计并实现了静态二进制翻译系统SQEMU.基于SPEC2006和nbench测试集,从x86平台翻译到Alpha平台的实验表明,SQEMU相对QEMU平均加速比分别达2.09倍和6.39倍.

二进制翻译;QEMU;SQEMU;间接分支;地址索引映射表

二进制翻译[1]已广泛应用于软件安全分析[2]、软件逆向工程、系统虚拟等领域,并已成为软件迁移的主流技术.例如,FX!32把x86平台下的Win32应用程序翻译到Alpha平台[3];昆士兰大学开发的跨平台静态二进制翻译器UQBT,可以支持不同源平台和目的平台[4];跨平台动态二进制翻译器QEMU,支持进程级和系统级虚拟,已支持国产龙芯平台[5].

主流二进制翻译可以分为动态二进制翻译、静态二进制翻译和动静结合的二进制翻译.动态二进制翻译是一种即时翻译技术,在运行目标程序时动态生成所需代码,能够容易解决代码发现和代码定位问题[6-8].动态二进制翻译需要在执行目标程序的同时生成代码,代码优化时间占程序执行时间,所以不能采用深度的优化方法.另外,动态二进制翻译须在执行所生成目标代码的同时,完成加载分析、运行环境设置、实时翻译、代码缓存管理、代码块切换等工作.一些技术如热路径优化[9]、寄存器映射[10]、多线程优化[5]等提高了动态二进制翻译的效率,但未解决动态二进制翻译效率低的问题.静态二进制翻译在不运行目标程序的情况下,静态分析可以执行程序,提取指令进行翻译,能够采用复杂的代码分析和优化算法,生成高质量代码,执行效率高.静态二进制翻译难处理代码发现和代码定位问题,在实际应用中受到限制.

代码发现问题是指在静态条件下难获取间接分支目标地址的问题以及难以区分指令与数据的问题.间接分支指令的目标地址可能是寄存器的值或者某一内存的值,在静态条件下难获取.代码定位问题是指即使在程序执行时能够获得间接分支的目的地址,但是难确定该源平台目的地址对应于目的平台代码的地址.源平台指令集是RISC时,如MIPS、ARM、PowerPC,代码发现问题相对简单.

为了解决代码定位问题,本文提出地址索引映射表法.在静态翻译过程中,使用数组结构Labels保存源平台每条指令对应的目的平台指令的首地址,同时索引数组Index保存源平台指令地址在Labels中对应的索引位置,从而根据Index和Labels得到源平台地址在目的平台对应的地址.

动态二进制翻译器QEMU[11]采用TCG中间表示,可以支持x86、ARM、MIPS、Alpha、PowerPC等平台.本文基于QEMU,提出静态二进制翻译框架(Static-QEMU, SQEMU).SQEMU采用QEMU的前端文件分析和TCG中间表示,继承了QEMU跨平台特性,并使用地址索引映射表法解决了代码定位问题.

1 相关工作

静态二进制翻译和动态二进制翻译在不同的平台已有不同实现,下面对二进制翻译和间接分支处理的相关工作进行介绍,并且重点介绍QEMU翻译器的系统结构.

1.1 QEMU翻译原理

QEMU是一个高效跨平台的动态二进制翻译系统.QEMU在用户模式下,支持多源平台和多目的平台.QEMU采用指令集无关中间表示TCG,可以实现将x86、Arm、Alpha、PowerPC等平台的指令序列翻译为TCG中间表示,再翻译为目标指令集.TCG技术屏蔽了不同平台的差异,是QEMU跨平台性的关键技术.QEMU翻译过程如图 1所示.

图1 QEMU翻译过程Fig.1 Translation process of QEMU

QEMU在TCG中间表示层面未实现有效的优化手段,一方面是因为优化算法本身占用运行时间;另一方面,提高生成代码质量不能减少基本块切换和生成代码维护开销.一些基于LLVM的动态二进制翻译器能够生成高质量代码,但是翻译和块切换开销在运行时仍然存在.与QEMU和基于LLVM的动态二进制翻译器[9,12-13]相比,SQEMU分离翻译时间、代码优化时间与目标程序执行时间,使得在同等优化手段下,SQEMU能够更高效.由于代码优化时间不受运行时的限制,能够采用不同层次的优化算法,生成高质量的执行代码.

1.2 现有间接分支处理方法

1.2.1 解释器处理间接分支 UQBT[4]是一个跨平台的静态二进制翻译器,将源平台二进制文件Ms抽象为机器无关HRTL,进行HRTL表示优化,生成可执行文件.将HRTL翻译为机器指令,须处理间接分支,UQBT在运行时使用解释器获得Ms到Mt的地址映射,并且需要使用源二进制文件的代码段.与UQBT相比,SQEMU使用源地址索引映射表保存了源指令地址到目标指令块地址的映射,查找快速且不需再次使用二进制文件的代码段.

1.2.2 地址映射表 Shen等[14]提出基于LLVM的动静结合的二进制翻译系统HBT,HBT将动态翻译器作为目标代码的一个动态库,并链接入二进制文件.执行二进制文件遇到间接分支语句后,查找地址映射表确认分支目标地址,若未找到,则启动动态二进制翻译器.由此可见,地址映射表的结构设计是系统执行效率的一个瓶颈.HBT采用LLVM switch指令,生成一系列的if-else比较指令,需要比较和跳转才能定位到目标地址.若跳转地址在文件的最后,则将比较所有地址,造成大量的查找消耗,所以不可能将所有目标地址放入LLVM switch列表.HBT仅将返回地址、函数指针、函数入口点作为地址映射表项,对switch语句产生的间接跳转指令没有统一的解决方法,在实现中仅对ARM平台二进制文件作了处理.与HBT相比,SQEMU采用地址索引映射表法,以空间换取时间,能够高效定位间接跳转的目的地址,从而确保翻译生成的目标二进制文件高效执行.

2 SQEMU整体设计

现有的静态二进制翻译难以处理间接分支,而动态二进制翻译效率低,为了解决上述问题,提出能够高效处理间接分支指令的静态翻译器SQEMU.

2.1 SQEMU系统框架

SQEMU包括前端源指令提取、平台无关抽象和后端目标代码生成3个阶段.其中,源文件解析器、前端解码器构成SQEMU前端,TCG优化器、后端编码器、目标文件生成器构成SQEMU后端.图 2展示了各模块的依赖关系.其中前端和TCG优化器采用QEMU相应模块,删除了QEMU中控制中心、缓存管理和执行模块,添加了目标文件生成器.

图2 SQEMU框架设计Fig.2 Framework of SQEMU

源文件解析器分析源平台可执行文件,获取程序入口地址,提取代码段、数据段、只读数据段、初始化段、动态链接表、全局符号表等.数据段和只读数据段用于目标代码执行;代码段用于翻译;全局符号表和动态链接表用于对用户函数和库函数的定位和使用.

前端解码器逐条指令对源平台指令解码.SQEMU使用了QEMU的指令译码部分,能够对多源平台如x86、ARM、MIPS等指令译码.根据译码器分析出的指令,生成相同语义的TCG指令.

TCG分析优化器对平台无关的中间TCG表示进行优化,例如活性分析、块内寄存器分配.

后端编码器按TCG中间表示生成目的平台指令.在目标代码层次根据平台特点采取各种优化方法,如用户函数中调用与返回时冗余操作的消除,库函数调用时使用寄存器快速传递参数.

目标文件生成器重新组织源elf文件的代码段数据段、动态链接段,需要处理库函数借口和间接调用和间接跳转指令.从源文件分析器获得了可执行文件的数据段、只读数据段、全局符号表等信息,从TCG生成器获得了代码段、初始化代码段对应的TCG中间表示序列.目标代码生成器需要重新组织各段并生成TCG对应的目标代码.对于数据段、只读数据段、未初始化数据段映射到源文件所指定的内存位置,以便代码读写访问.对于静态二进制翻译器,需要解决库函数接口设计和函数调用与返回问题.

2.2 库函数接口设计

SQEMU对本地库函数进行封装,在目标平台模拟源平台参数传递和返回规则,实现目标二进制文件运行时调用本地库函数的功能.

一般情况下,在翻译阶段,如果函数调用指令调用动态链接库函数,首先根据该库函数的参数列表按照源平台参数传递规则提取出所有参数,然后使用所提取的参数调用目的平台对应的库函数.在函数返回后,获取函数返回值,并将该返回值按照源平台规则返回到相应的寄存器或者变量.

特殊的库函数调用需要复杂的处理机制,当调用的库函数参数为结构体指针时,源平台与目的平台结构体的实现不完全一致,例如某字段位数不同,字段的数据类型不同.在调用目标库函数前,需要临时申请目的平台结构体空间,函数返回后把临时结构体的各项值存储到源平台结构体的对应位置.

当调用的库函数参数个数和类型不确定,如printf、sprintf、fprintf时,需要在调用接口实现对格式化字符串的分析,获取实时的参数,然后调用目的平台库函数.

由于库函数的复杂性和多样性,在进行库函数封装时需要处理参数获取、返回值获取、格式化字符串分析、结构体中各项值获取等问题,库函数封装是一项具有挑战性的工作.在源可执行程序多次调用库函数的情况下,库函数本地化调用能够显著提升运行效率.

2.3 本地栈作为影子栈

2.3.1 QEMU块链接和存在的问题 在QEMU的动态执行过程中,基本块切换占用了执行时间.当执行到基本块末尾时需要判断下一个基本块的位置,若能够准确判断后继块的地址,则可以直接跳转到后继块代码;否则需要在已翻译的缓存代码中查找后继块,占用大量执行时间.准确高效的预测后继基本块的地址,能够减少块切换的消耗.

当前基本块的末尾指令是直接分支时,后继基本块至多只有两个,可以通过条件判断的方法进行基本块链接,QEMU通过在该类基本块尾添加判断和分支语句实现基本块链接.

当前基本块的末尾指令是间接分支、函数调用或函数返回指令时,后继基本块的地址可能有多个,难以进行基本块链接.图3展示了块链接的执行路径.QEMU未对函数调用和函数返回指令实现基本块链接技术,需要在已翻译代码缓存中查找后继块地址,占用了大量的执行时间.

图3 QEMU基本块链接Fig.3 Block chain of QEMU

2.3.2 SQEMU的改进 对于函数调用和函数返回指令,SQEMU采用本地堆栈作为影子栈[3]的方法,实现了函数本地化翻译.

图4 函数调用与返回Fig.4 Calling function and return

使用本地函数调用方式,同时模拟源平台函数调用操作,函数入口遵循本地函数实现规则;函数末尾返回时,模拟源平台返回操作,按照目的平台函数返回规则.假设源平台为x86平台,目的平台为某国产平台,图4展示了函数本地化调用涉及的堆栈操作.x86函数调用指令生成的某国产平台指令包括模拟x86栈操作、调用地址映射函数和调用目的函数3个部分.该例指令为间接调用,需要使用间接分支处理函数Ax2LAx获取目的地址.在目的函数exe_addl首指令前,将函数返回值保存入本地栈,再执行函数体部分,最后ret指令模拟x86平台栈操作并从本地栈取出返回地址返回.

从上述过程可以看出,在函数调用时,返回地址保存入本地栈;函数返回时,从本地栈取出返回地址返回.本地栈作为影子栈实现了函数本地化,避免了函数调用和返回查找基本块的操作.

3 间接分支处理

间接分支指令在静态翻译时无法确定该指令的目的地址,在不同运行时分支目标地址可能改变.使用源地址索引映射表来确定目的地址.

3.1 相关定义与符号约定

定义1 间接跳转指令 跳转指令的目的地址是某寄存器或某内存位置中的值,通过静态分析难以获得该目的地址.

定义2 间接调用指令 调用指令所调用的目的函数地址是某寄存器或某内存位置中的值,通过静态分析难以获得该目的地址.

定义3 间接分支指令 间接跳转和间接调用统称为间接分支.特殊地,switch产生的分支指令属于间接分支指令.

定义4 直接分支指令 分支指令的目的地址是立即数的分支指令,该地址能够静态获取.

定义下述符号表示翻译过程中涉及的概念.

Ms:源平台.

Mt:目的平台.

A0, A1, A2,…, An, …:源平台地址,A0表示程序入口地址.

LA0, LA1, LA2,…, LAn, …:源平台地址处的指令对应的目的平台指令块首地址.

Bs:源平台二进制文件.

Bt:使用SQEMU翻译Bs到Mt所得的二进制文件.

3.2 地址索引映射表法

在程序还没有运行的情况下,得到精确的所有的跳转目的地址是非常难的问题,需要分析出程序的所有可能的执行路径.对于间接跳转指令,该指令可能跳转到程序的任何一个位置.

为了解决Ms指令地址与Mt指令地址的映射问题,需要保存所有Ms指令对应的Mt指令的地址,并须索引机制以保证映射过程的高效性.UQBT采用高层寄存器传输语言HRTLs,抽象了平台无关中间表示,是一种向高层次的抽象,无法定位单条Ms指令对应的中间表示和Mt代码.相对地,QEMU中间表示采用微指令分解Ms指令的TCG方法,能够实现每条Ms指令到TCG再到Mt指令的映射.本文基于QEMU中间表示TCG,提出地址索引表法.

使用源文件解析器分析源可执行文件的各个段数据,提取出包含指令的代码段、初始化代码段、附加段的信息,按照地址由小到大的顺序,即A0, A1, A2,…, An, …,逐条翻译Ms指令到TCG中间表示,再翻译为Mt指令.例如An处一条指令作为一个基本块,在生成的目标代码首部加上标签LAn,并且使用数组保存该标签值,即目标地址信息.使用An相对A0的偏移量作为索引,能够快速定位目的地址.目的平台指令的首地址数组和索引数组的构造算法如下.

∥功能:构造所有Ms指令翻译生成Mt指令的地址数组和索引数组

∥输入:静态分析得到的Ms二进制文件所有指令地址{ A0, A1, A2, …, An, …}

∥输出:Labels数组包括所有Ms指令翻译生成Mt指令的地址数组;Index数组包括所有Ms指令地址对应的Mt指令的地址在Labels中的索引位置

foreach Ax in { A0, A1, A2, …, An, …}

解析地址Ax处的指令获取操作码和操作数

根据解析结果翻译此指令为TCG序列

把TCG序列翻译为Mt指令块,并使用LAx标记此指令块

令Labels[x] = LAx ; Index[Ax-A0] = x

Endfor

图5给出构造过程.

图5 地址数组与索引数组的构造过程Fig.5 Construction of labels and index

图6 x86指令翻译为某类Alpha指令举例Fig.6 Example of translating x86 ISA to Alpha ISA

下面举例说明该算法的执行效果.当Ms为x86平台,Mt为某国产平台时,A0=0x80486e0,前3条指令为xor、pop和mov,对应的TCG表示块和生成的指令,如图6所示.图6举例显示了Labels数组和Index数组的前3项值,其中Labels的值为嵌入汇编的标签,地址值在编译时确定.若分支指令目标地址为0x80486e2,则访问Index获得的索引值为1,接着访问Labels获得L_0x80486e2的值.

在Bt运行时,执行到间接分支指令生成的代码块时,能够获取当前指令所跳转的在Ms环境下的目的地址值Ax,则运行时使用Ax查找对应LAx的算法如下.

∥功能:在运行时查找间接分支指令目的地址Ax所对应的Mt地址LAx

∥输入:间接分支指令目的地址Ax,Bs程序入口地址A0

∥输出:Ax对应的Mt指令地址LAx

Mt_Address Ax2LAx(Ms_Address Ax){

return Labels[Index[Ax-A0]];

}

在目标二进制文件运行遇到间接跳转指令时,使用Ax2LAx函数快速映射目的地址.以图4为例,间接调用指令call *%eax调用函数exec_addl,所在地址是0x8048794,则使用Ax2LAx查找函数可以获得标签L_0x8048794的值,即对应函数的首地址,然后转移到该标签的位置,整个映射过程只需几条指令.

从上述构造算法可以看出,Labels保存了所有Ms指令对应的目标代码块地址,Index保存了该所有Ms指令在Labels中的索引位置.特别地,若Ms指令为定长,如Alpha指令,索引数组Index项目差值为固定值,即Alpha指令长度,所以Index数组可以省略.地址索引映射表查找方法,以最小的查询代价,解决了间接跳转和间接调用问题.

4 实验结果

下面给出SQEMU的性能测试,并与QEMU进行对比,包括热代码处理能力和整体性能测试.热代码包括2类:一类由循环体生成,一类由递归函数生成.首先使用nbench测试集测试了SQEMU和QEMU处理循环如for、while类热代码的能力;其次,对于递归热代码,使用典型的递归算法如Fibonacci、n-queen、qsort验证SQEMU使用本地堆栈作为影子栈对函数调用的加速效果.最后,选取SPEC2006测试集中的部分程序比较SQEMU在翻译常用程序时相对QEMU的性能提升.令TQEMU和TSQEMU分别为QEMU和SQEMU执行可执行程序时的时间,Ssp为SQEMU相对QEMU的加速比,

4.1 实验环境

实验的目的在于验证SQEMU的正确性和效率,nbench与SPEC2006均含有正确性验证模块,测试用例如表1所示,实验环境如表2所示.

表1 nbench和SPEC2006测试用例

表2 二进制翻译环境

4.2 循环热代码性能测试

Nbench统计给定时间(5 s)内单项测试代码块的迭代次数来评价系统.每项测试代码块都是典型的热代码,该类代码的执行时间远远多于翻译时间.为了展示SQEMU处理热代码的能力,使用nbench测试程序与QEMU进行对比.

从图7可以看出,对于不同的测试项目,SQEMU与QEMU显示了各自的性能优势.对于STRING SORT项目,由于字符串比较操作频繁使用strcmp、strncmp、strlen等字符串相关库函数,SQEMU的执行速度是QEMU的39.25倍.类似地,对于FOURIER、IDEA和FP EMULATION,由于使用到了pow、sin、cos、memmove等函数,SQEMU获得相应的加速比.对于NEURAL NET和LU DECOMPOSITION,由于在单条翻译Ms指令过程中缺少上下文关联,引入了冗余指令,造成SQEMU运行速度略慢于QEMU.

从nbench的测试结果来看,虽然SQEMU引入了冗余指令,但SQEMU的整体加速的效果是十分明显的,平均加速比为6.39.

图7 SQEMU对QEMU在nbench测试集项目的加速比Fig.7 Speedup on nbench of SQEMU to QEMU

图8 SQEMU对QEMU在递归算法的加速比Fig.8 Speedup on recursive algorithms of SQEMU to QEMU

4.3 递归热代码性能测试

递归算法是广泛使用的一类算法,会造成反复执行的热代码.递归算法会反复调用某一或某些函数,产生大量的函数调用和返回指令.能否高效地处理函数调用,影响目标程序执行的效率.图8展示了翻译典型递归算法时SQEMU对QEMU的加速比.

QEMU的基本块链接算法仅对直接跳转和条件跳转进行实现,未处理函数调用和返回指令.QEMU在执行到函数调用指令时,需要到代码管理模块查找目标代码地址.SQEMU采用本地堆栈作为影子栈,实现了用户自定义函数调用的本地化调用,减少了函数调用和返回时代码切换的消耗.从图8可以看出,对于含有大量函数调用的递归算法,SQEMU能够显著地提高代码运行效率,平均加速比达2.64.

4.4 整体性能测试

SPEC2006测试集中的程序为工程应用中实际使用到的程序,该测试集的执行结果反映出翻译系统的整体性能.图9展示了对SPEC2006中的部分应用SQEMU对QEMU的加速比.

图9 SQEMU对QEMU在部分SPEC2006测试程序的加速比Fig.9 Speedup on part of SPEC2006 of SQEMU to QEMU

在实际工程中的程序中,有大量的代码处于初始化、结束阶段,调用次数少,不是热代码,从而动态翻译QEMU每执行完一个基本块,就需要翻译下一个基本块,代码块切换频繁,占用执行时间.SQEMU在执行目标代码阶段不存在再翻译与代码维护,提高了目标代码执行效率.对于频繁使用库随机函数specrand应用,反复调用产生随机数的库函数,加速比高达5.98.对SPEC2006部分程序进行测试可知,SQEMU对QEMU的平均加速比达2.09.

5 结 语

本文提出基于地址索引映射表和QEMU的快速、可重定向的静态二进制翻译器Static-QEMU.SQEMU继承了QEMU多源多目的平台的特点,具有良好的拓展性.SQEMU在翻译和代码生成阶段构造的地址索引表,在执行目标代码阶段能够快速查找间接分支在目的平台的地址.SQEMU封装本地库函数,使得目标代码能够调用本地库函数.SQEMU翻译阶段与目标代码执行阶段分离,消除了执行过程中代码动态翻译、代码块切换、生成代码维护等时间.通过与QEMU性能对比的实验表明,SQEMU获得可观的性能提升,但是需要进一步实现库函数封装和冗余代码优化.

[1] ALTMAN E, KAELI D, SHEFFER Y. Welcome to the opportunities of binary translation [J]. IEEE Computer, 2000, 33(3): 40-45.

[2] SHAN Zheng, GUO Hao-ran, PANG Jian-min. BTMD: a framework of binary translation based Malcode detector [C]∥ 2012 International Conference on Cyber-Enabled Distributed Computing and Knowledge Discovery. [S. l.]: IEEE, 2012: 39-43.

[3] CHERNOFF A, HOOKWAY R. DIGITAL FX! 32 running 32-bit× 86 applications on Alpha NT [C]∥Proceedings of the USENIX Windows NT Workshop on the USENIX Windows NT Workshop. [S. l.]: USENIX, 1997: 37-42.

[4] CRISTINA C, VAN EMMERIK M. UQBT: adaptable binary translation at low cost [J]. IEEE Computer, 2000, 33(3): 60-66.

[5] 廖银. 动态二进制翻译建模及其并行化研究[D]. 合肥: 中国科学技术大学, 2013. LIAO Yin. Dynamic binary translation modeling and parallelization research [D]. Hefei:University of Science and Technology of China, 2013.

[6] JIA Ning, YANG Chun, WANG Jing, et al. SPIRE: improving dynamic binary translation through SPC-indexed indirect branch redirecting [C]∥ ACM SIGPLAN Notices. [S. l.]: ACM, 2013: 1-12.

[7] HISER J D, WILLIAMS D, MARS J, et al. Evaluating indirect branch hadling mechanisms in software dynamic translation systems [C]∥International Symposium on Code Generation and Optimization. California: San Jose, 2007: 61-73.

[8] SUN Ting-tao, YANG Yin-dong, YANG Hong-bo, et al. Return instruction analysis and optimization in dynamic binary translation [C]∥4th International Conference on Frontier of Computer Science and Technology. Shanghai: IEEE, 2009: 435-440.

[9] JEFFERY A. Using the LLVM compiler infrastructure for optimized, asynchronous dynamic translation in Qemu [D]. South Australia: University of Adelaide Honors Thesis, 2009.

[10] LIAO Yin, SUN Guang-zhong, JIANG Hai-tao, et al. All registers mapping method in dynamic binary translation [J]. Computer Applications and Software, 2011, 28(11): 21-48.

[11] FABRICE B. Qemu, a fast and portable dynamic translator [C]∥Proceedings of the USENIX 2005 Annual Technical Conference, FREENIX Track. Anaheim: [s. n.], 2005: 41-46.

[12] CHEN Jiunn-yeu, YANG Wuu, HUANG Jack, et al. A static binary translator for efficient migration of ARM based applications [C]∥Proceedings of the 6th Workshop on Optimizations for DSP and Embedded Systems. Boston: [s.n.], 2008.

[13] LLVM-QEMU, Backend for QEMU using LLVM components [CP/OL]. [2014-12-12]. http:∥code.google.com/p/llvm-qemu/.

[14] SHEN Bor-yeh, YOU Jyun-yan, YANG Wuu, et al. An LLVM-based hybrid binary translation system [C]∥2012 7th IEEE International Symposium on Industrial Embedded Systems (SIES). Karlsruhe: IEEE, 2012: 229-236.

Retargetable static binary translator based on QEMU

LU Shuai-bing, PANG Jian-min, SHAN Zheng, YUE Feng

(StateKeyLaboratoryofMathematicalEngineeringandAdvancedComputing,PLAInformationEngineeringUniversity,Zhengzhou450001,China)

Address-indexed mapping table (AMT) was presented to efficiently handle indirect branches. An address array was used to store all target addresses, and an index array was used to contain the index values of all source addresses in address array. Using index, only several instructions were used to map a source address to the corresponding target address, and the speed of execution was improved. An approach combining shadow stack and native library jacketing was presented to efficiently handle function call. The speed of function call was improved by passing parameters and returning value in native stack. Native function can be indirectly called by handling parameters and return value of native library function through jacketing interface. Static-QEMU (SQEMU) was designed and implemented based on these approaches and QEMU. For x86 codes to Alpha platforms, SQEMU gains factors of 2.09 and 6.39 times speedup over QEMU for the SPEC2006 and nbench benchmarks respectively.

binary translation; QEMU; SQEMU; indirect branches; address-indexed mapping table

2014-12-12. 浙江大学学报(工学版)网址: www.journals.zju.edu.cn/eng

国家自然科学基金资助项目(61472447).

卢帅兵(1990-),男,硕士生,从事计算机体系结构、软件安全的研究. ORCID: 0000-0002-8975-4620. E-mail: yeaxxx@163.com 通信联系人:庞建民,男,教授. ORCID: 0000-0002-3216-8970. E-mail: jianmin_pang@hotmail.com

10.3785/j.issn.1008-973X.2016.01.023

TP 314; TN 443

A

1008-973X(2016)01-0158-08

猜你喜欢
函数调用基本块二进制
基于级联森林的控制流错误检测优化算法
基于C语言的数学菜单的设计与实现
用二进制解一道高中数学联赛数论题
中等数学(2021年8期)2021-11-22 07:53:38
距离与权重相结合的导向式灰盒模糊测试方法
计算机工程(2021年3期)2021-03-18 08:03:34
一种检测控制流错误的多层分段标签方法
有趣的进度
二进制在竞赛题中的应用
中等数学(2019年4期)2019-08-30 03:51:44
基于函数调用序列模式和函数调用图的程序缺陷检测方法*
探讨C++编程中避免代码冗余的技巧
Unity3D项目脚本优化分析与研究
中国新通信(2017年1期)2017-03-08 03:12:21