CN114461227B - 运行软件的方法、装置以及机器可读存储介质 - Google Patents
运行软件的方法、装置以及机器可读存储介质 Download PDFInfo
- Publication number
- CN114461227B CN114461227B CN202210381743.2A CN202210381743A CN114461227B CN 114461227 B CN114461227 B CN 114461227B CN 202210381743 A CN202210381743 A CN 202210381743A CN 114461227 B CN114461227 B CN 114461227B
- Authority
- CN
- China
- Prior art keywords
- function
- instruction
- code
- software
- binary code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
提供一种运行软件的方法、装置和机器可读存储介质。该方法包括:对第一软件的源二进制代码进行静态翻译,得到目标二进制代码,该源二进制代码包括第一调用指令,该第一调用指令所调用的函数地址由第一软件在运行过程中动态生成,在目标二进制代码中,第一调用指令被翻译成包装函数的调用指令;在目标机器上运行第一软件,并在运行第一软件的过程中执行包装函数,以执行以下操作:响应于函数地址指向源二进制代码,跳转至目标二进制代码中的与函数地址对应的翻译地址;和/或,响应于函数地址指向第一软件运行期间生成的代码,对第一软件运行期间生成的代码进行翻译。本申请实施例提出的静态翻译方法可以降低软件在目标机器上运行时的延迟,并可以增加翻译过程中指令优化的空间。
Description
技术领域
本申请实施例涉及软件处理领域,具体涉及一种运行软件的方法、装置以及机器可读存储介质。
背景技术
二进制翻译(binary translation)技术可将一种指令集架构(instruction setarchitecture,ISA)中的指令序列转化成另一种指令集架构中的指令序列。相关技术主要采用动态翻译的方式进行二进制翻译。所谓动态翻译,指的是在二进制程序运行时对执行到的片段进行翻译。但是,动态翻译会导致软件运行过程出现延时。
发明内容
本申请实施例涉及一种运行软件的方法、装置以及机器可读存储介质,以降低翻译后的软件在运行过程中的延时。
第一方面,提供一种运行软件的方法,所述方法用于将第一软件从源机器移植至目标机器,所述源机器的处理器基于第一指令集架构,所述目标机器的处理器基于第二指令集架构,所述第一指令集架构与所述第二指令集架构不同,所述方法包括:对所述第一软件的源二进制代码进行静态翻译,得到目标二进制代码,其中所述源二进制代码为基于所述第一指令集架构的代码,所述目标二进制代码为基于所述第二指令集架构的代码,所述源二进制代码包括第一调用指令,所述第一调用指令所调用的函数地址由所述第一软件在运行过程中动态生成,在所述目标二进制代码中,所述第一调用指令被翻译成第二调用指令,所述第二调用指令用于调用所述第一调用指令的包装函数;在所述目标机器上运行所述第一软件,并在运行所述第一软件的过程中执行所述包装函数,以执行以下操作:响应于所述函数地址指向所述源二进制代码,跳转至所述目标二进制代码中的与所述函数地址对应的翻译地址;和/或,响应于所述函数地址指向所述第一软件运行期间生成的代码,调用动态翻译引擎对所述第一软件运行期间生成的代码进行翻译。
作为一种可能的实现方式,所述包装函数还用于执行以下操作:响应于所述函数地址指向所述第二指令集架构的代码,对所述第一调用指令进行ABI转换,得到转换后的调用指令,并执行所述转换后的调用指令;和/或响应于所述函数地址指向所述第一指令集架构的代码,对所述第一调用指令进行ABI转换,得到所述第一调用指令的等价指令,并执行所述等价指令。
作为一种可能的实现方式,所述包装函数包括第一参数和第二参数,所述第一参数用于指示内存中的代码的类型,所述第二参数用于指示所述函数地址,其中所述函数地址指向的代码的类型包括以下类型中的一种或多种:第一类型,表示所述函数地址指向所述源二进制代码;第二类型,表示所述函数地址指向所述第一软件运行期间生成的代码;第三类型,表示所述源二进制代码翻译过程中生成的翻译代码;以及第四类型,表示所述函数地址指向所述第二指令集架构的代码。
作为一种可能的实现方式,所述第一参数的取值由所述目标机器上的动态加载器在加载所述第一软件时提供。
作为一种可能的实现方式,所述对所述第一软件的源二进制代码进行静态翻译,包括:对所述源二进制代码中的函数进行识别,得到第一函数集合;针对所述第一函数集合中的函数,以函数为单位进行所述静态翻译。
作为一种可能的实现方式,所述对所述源二进制代码中的函数进行识别,得到第一函数集合,包括:根据所述源二进制代码中的符号表对所述源二进制代码中的函数进行识别,得到第二函数集合;根据所述第二函数集合中的每个函数的内部调用指令对所述源二进制代码中的函数进行识别,得到第三函数集合;确定所述第二函数集合和所述第三函数集合的并集,得到所述第一函数集合。
作为一种可能的实现方式,所述方法还包括:将所述目标二进制代码转换为中间表示;对所述中间表示进行优化,得到所述目标二进制代码的优化代码。
作为一种可能的实现方式,所述第一调用指令包括call指令、jump指令和条件跳转指令中的一种或多种。
第二方面,提供一种运行软件的装置,所述装置用于将第一软件从源机器移植至目标机器,所述源机器的处理器基于第一指令集架构,所述目标机器的处理器基于第二指令集架构,所述第一指令集架构与所述第二指令集架构不同,所述装置包括:翻译模块,用于对所述第一软件的源二进制代码进行静态翻译,得到目标二进制代码,其中所述源二进制代码为基于所述第一指令集架构的代码,所述目标二进制代码为基于所述第二指令集架构的代码,所述源二进制代码包括第一调用指令,所述第一调用指令所调用的函数地址由所述第一软件在运行过程中动态生成,在所述目标二进制代码中,所述第一调用指令被翻译成第二调用指令,所述第二调用指令用于调用所述第一调用指令的包装函数;运行模块,用于在所述目标机器上运行所述第一软件,并在运行所述第一软件的过程中执行所述包装函数,以执行以下操作:响应于所述函数地址指向所述源二进制代码,跳转至所述目标二进制代码中的与所述函数地址对应的翻译地址;和/或,响应于所述函数地址指向所述第一软件运行期间生成的代码,调用动态翻译引擎对所述第一软件运行期间生成的代码进行翻译。
作为一种可能的实现方式,所述包装函数还用于执行以下操作:响应于所述函数地址指向所述第二指令集架构的代码,对所述第一调用指令进行ABI转换,得到转换后的调用指令,并执行所述转换后的调用指令;和/或响应于所述函数地址指向所述第一指令集架构的代码,对所述第一调用指令进行ABI转换,得到所述第一调用指令的等价指令,并执行所述等价指令。
作为一种可能的实现方式,所述包装函数包括第一参数和第二参数,所述第一参数用于指示内存中的代码的类型,所述第二参数用于指示所述函数地址,其中所述函数地址指向的代码的类型包括以下类型中的一种或多种:第一类型,表示所述函数地址指向所述源二进制代码;第二类型,表示所述函数地址指向所述第一软件运行期间生成的代码;第三类型,表示所述源二进制代码翻译过程中生成的翻译代码;以及第四类型,表示所述函数地址指向所述第二指令集架构的代码。
作为一种可能的实现方式,所述第一参数的取值由所述目标机器上的动态加载器在加载所述第一软件时提供。
作为一种可能的实现方式,所述翻译模块用于对所述源二进制代码中的函数进行识别,得到第一函数集合;针对所述第一函数集合中的函数,以函数为单位进行所述静态翻译。
作为一种可能的实现方式,所述翻译模块用于根据所述源二进制代码中的符号表对所述源二进制代码中的函数进行识别,得到第二函数集合;根据所述第二函数集合中的每个函数的内部调用指令对所述源二进制代码中的函数进行识别,得到第三函数集合;确定所述第二函数集合和所述第三函数集合的并集,得到所述第一函数集合。
作为一种可能的实现方式,所述装置还包括:转换模块,用于将所述目标二进制代码转换为中间表示;优化模块,用于对所述中间表示进行优化,得到所述目标二进制代码的优化代码。
作为一种可能的实现方式,所述第一调用指令包括call指令、jump指令和条件跳转指令中的一种或多种。
第三方面,提供一种运行软件的装置,包括:存储器,用于存储指令;处理器,用于执行所述存储器中存储的指令,以执行如第一方面或第一方面中的任意一种可能的实现方式所述的方法。
第四方面,提供一种机器可读存储介质,其上存储有用于执行如第一方面或第一方面中的任意一种可能的实现方式所述的方法的指令。
第五方面,提供一种程序产品,包括用于执行如第一方面或第一方面中的任意一种可能的实现方式所述的方法的指令。
相关技术之所以选用动态翻译,主要是因为某些调用指令所调用的函数地址(或称目标地址)在软件运行前无法确定。目标地址无法确定,则无法确认该目标地址处的代码是什么样的代码类型,或者说无法确认目标地址的ABI信息,因此无法进行合适的静态翻译。本申请实施例利用包装函数包装了源二进制代码中的此类调用指令,从而实现了二进制代码的静态翻译。由于本申请实施例基于静态翻译后的二进制代码运行软件,因此能够降低软件在目标机器上运行时的延迟。
附图说明
为了更清楚地说明本申请实施例或背景技术中的技术方案,下面将对本申请实施例或背景技术中所需要使用的附图进行说明。
图1本申请实施例提供的运行软件的方法的流程示意图。
图2是本申请实施例提供的函数识别方法的流程示意图。
图3是本申请实施例提供的静态翻译和软件运行的整体流程示例图。
图4是图3中的步骤S33的具体流程示例图。
图5是图3中的wrap_dispatch函数的执行过程示例图。
图6是本申请实施例提供的运行软件的装置的结构示意图。
图7是本申请实施例提供的装置的结构示例图。
具体实施方式
下面结合本申请实施例中的附图对本申请实施例进行描述。以下描述中,参考形成本公开一部分并以说明之方式示出本申请实施例的具体方面或可使用本申请实施例的具体方面的附图。应理解,本申请实施例可在其它方面中使用,并可包括附图中未描绘的结构或逻辑变化。因此,以下详细描述不应以限制性的意义来理解,且本申请的范围由所附权利要求书界定。例如,应理解,结合所描述方法的揭示内容可以同样适用于用于执行所述方法的对应设备或系统,且反之亦然。例如,如果描述一个或多个具体方法步骤,则对应的设备可以包含如功能单元等一个或多个单元,来执行所描述的一个或多个方法步骤(例如,一个单元执行一个或多个步骤,或多个单元,其中每个都执行多个步骤中的一个或多个),即使附图中未明确描述或说明这种一个或多个单元。另一方面,例如,如果基于如功能单元等一个或多个单元描述具体装置,则对应的方法可以包含一个步骤来执行一个或多个单元的功能性(例如,一个步骤执行一个或多个单元的功能性,或多个步骤,其中每个执行多个单元中一个或多个单元的功能性),即使附图中未明确描述或说明这种一个或多个步骤。进一步,应理解的是,除非另外明确提出,本文中所描述的各示例性实施例和/或方面的特征可以相互组合。
二进制翻译可以用来解决二进制层面的软件跨指令集架构运行的问题。具体而言,二进制翻译技术可将一种指令集架构中的指令序列转化成另一种指令集架构中的指令序列。例如,二进制翻译可以将x86指令集架构中的指令序列翻译成arm指令集架构(如arm64)中的指令序列,反之亦然。
二进制翻译包括静态翻译和动态翻译两种。静态翻译是在源机器的二进制程序A执行之前,对该二进制程序A进行翻译,以将该二进制程序A翻译成目标机器上的二进制程序文件B。基于静态翻译技术,一次翻译得到的翻译结果可以被多次使用。
动态翻译是在二进制程序运行时对执行到的片段进行翻译。目前相关技术提供的能有效工作的二进制翻译系统,基本均采用以基本块(basic block)为粒度,对待翻译软件进行动态翻译实现。动态翻译的缺点是:每次软件运行到没有翻译过的代码时均需要先进行翻译,导致软件运行过程有一定的延迟。此外,软件每次重新启动之后,都需要重新翻译之前可能已经运行过的代码。但是动态翻译之所以被广泛采用,主要因为待翻译的二进制代码中的有些值只能在软件运行的时候才能获得,导致静态翻译难以处理。例如,静态翻译中的一个重要的问题是:函数中经常包含其他函数的调用指令,如果调用指令所调用的函数地址无法确定(需要在软件运行过程中动态确定),那么就无法对该调用指令进行翻译。例如,假设函数F内部包含call eax指令(或者jumpeax指令)。eax寄存器中的值(即被调用的函数地址)是动态生成的,因此不知道该eax寄存器中的地址对应代码的ABI信息和指令集信息,如果直接等语义静态翻译的话,跳到该地址之后,有可能无法继续执行。正是由于该原因,相关技术基本上均放弃了静态翻译,转而采用动态翻译的方式对软件进行二进制翻译。
针对上述问题,下面结合图1,对本申请实施例进行详细描述。
图1为本申请实施例提供的一种运行软件的方法的示意性流程图。该方法100可用于将第一软件从源机器移植至目标机器。
本申请实施例提及的第一软件可以是任意类型的软件。例如,该第一软件可以是普通的软件,也可以是基于语言虚拟机(如java虚拟机或.net虚拟机)的软件。该第一软件可以是图形处理软件,也可以游戏软件。
源机器可以指原本运行第一软件的机器。在一些实施例中,源机器也可称为客户机。源机器的处理器可以是基于第一指令集架构的处理器。该第一指令集架构例如可以是x86指令集架构,也可以是arm指令集架构(如arm64)。在图1的实施例中,第一软件是基于第一指令集架构开发的软件,因此,该第一软件可以在源机器上正常运行。
目标机器可以指希望移植第一软件的机器。在一些实施例中,目标机器也可称为主机。目标机器的处理器可以是基于第二指令集架构的处理器。该第二指令集架构与第一指令集架构为不同的指令集架构。例如,如果第一指令集架构为x86指令集架构,则第二指令集架构可以为arm指令集架构。又如,如果第一指令集架构为arm指令集架构,则第二指令集架构为x86指令集架构。
第一软件可以采用源二进制代码在源机器上运行。该源二进制代码为基于第一指令集架构的代码。如果希望在目标机器上运行该第一软件,则需要将该源二进制代码翻译成目标二进制代码。该目标二进制代码为基于第二指令集架构的代码。
在对第一软件、源机器、目标机器等概念进行介绍的基础上,下面对图1方法中的各个步骤进行详细描述。图1的方法100可以包括步骤S110~步骤S140。该步骤S110~步骤S140可以由目标机器执行,例如可以由目标机器上的处理器执行。
参见图1,在步骤S110,对第一软件的源二进制代码进行静态翻译,得到目标二进制代码。源二进制代码可以包括第一调用指令。该第一调用指令可用于对函数进行调用。该第一调用指令所调用的函数地址由第一软件在运行过程中动态生成。也就是说,该第一调用指令所调用的函数地址在第一软件运行过程前是无法确定的(相关技术正是由于此类指令的存在是,所以舍弃了软件的静态翻译,转而使用软件的动态翻译)。在一些实施例中,第一调用指令也可称为函数的间接调用指令(或间接函数调用指令)。该包装函数实际上隔离了静态翻译中因为目标地址无法静态确定而不好处理的间接跳转或类似指令。该第一调用指令可以包括call指令、jump指令和条件跳转指令中的一种或多种。例如,该第一调用指令为call eax;或者,该第一指令为jumpeax。又如,该第一调用指令可以是jne指令等其他条件跳转指令。因此,在一些实施例中,第一调用指令所调用的函数地址也可替换为eax寄存器中的地址。
在对源二进制代码进行静态翻译的过程中,如果遇到第一调用指令,本申请实施例用函数将第一调用指令包装起来,形成第二调用指令。该第二调用指令可用于调用第一调用指令的包装函数(wrap函数)。换句话说,在目标二进制代码中,第一调用指令被翻译成上述第二调用指令。
第一软件在目标机器上运行时,该包装函数可以被执行,从而执行该第一调用指令。该包装函数可以结合第一软件运行过程产生的动态信息保证该第一调用指令所调用的函数地址被正确定位;或者,该包装函数可以结合第一软件运行过程产生的动态信息保证第一调用指令被正确执行。需要说明的是,本申请实施例提及的包装函数,指的是与第一调用指令有关的能够实现上述功能的函数,而并非要对函数的类型进行具体限定。通过包装函数的引入,本申请实施例把静态翻译的问题分离成了两个部分。第一部分是对源二进制代码中的除第一调用指令之外的指令或者目标地址能静态确认的指令(比如jmp 40000),这部分基本可以直接进行静态翻译。第二部分是第一调用指令,这部分可以采用将第一调用指令翻译成包装函数,然后在运行时动态地执行该包装函数,以实现该第一调用指令的准确调用。
在步骤S120,在目标机器上运行第一软件,并在运行第一软件的过程中执行包装函数。该包装函数可以根据函数地址(第一调用指令所调用的地址)指向的代码的类型(或性质),进行相应的逻辑处理。以第一调用指令为calleax或jumpeax为例,包装函数的主要作用可以理解为判断eax寄存器的地址所对应的代码的类型(或性质),然后根据eax寄存器的地址所对应的代码的类型,执行相应的操作。
在一些实施例中,该包装函数可以执行以下操作:响应于第一调用指令所调用的函数地址指向源二进制代码,跳转至目标二进制代码中的与函数地址对应的翻译地址。以源二进制代码为x64版的代码为例,假设内存中的地址范围0x10000-0x20000存储的是x64版的代码段,且第一调用指令所调用的函数地址指向这个代码段,则跳转至目标二进制代码中的与函数地址对应的翻译地址。
在一些实施例中,该包装函数可以执行以下操作:响应于第一调用指令所调用的函数地址指向第一软件运行期间生成的代码,调用动态翻译引擎对第一软件运行期间生成的代码进行翻译。
在一些实施例中,该包装函数可以执行以下操作:响应于第一调用指令所调用的函数地址指向第二指令集架构的代码,对第一调用指令进行ABI转换,并执行转换后的调用指令。例如,包装函数可以先判断第一调用指令所调用的函数地址是否指向的是目标机器的原生库(如libc,目标机器的原生库均基于第二指令集架构)。如果第一调用指令所调用的函数地址指向的是目标机器的原生库,则可以对第一调用指令进行ABI转换,以调用目标机器的原生库。直接调用目标机器的原生库的好处在于可以避免对第一软件所依赖的动态库(或称函数库)进行翻译。
本申请实施例利用包装函数包装了源二进制代码中的第一调用指令(包含动态成分),从而实现了二进制代码的静态翻译。由于本申请实施例基于静态翻译后的二进制代码运行第一软件,使得第一软件在目标机器上能够低延迟运行。
本申请实施例对包装函数的形式不作具体限定,只要能够执行上文提到的操作即可。下面给出包装函数的一种可能的形式。
在一些实施例中,该包装函数可以包括第一参数。第一参数可用于指示函数地址指向的代码的类型。函数地址指向的代码的类型可以包括以下类型中的一种或多种:第一类型,表示函数地址指向源二进制代码;第二类型,表示函数地址指向第一软件运行期间生成的二进制代码;第三类型,表示源二进制代码翻译过程中生成的翻译代码;以及第四类型,表示函数地址指向第二指令集架构的二进制代码。该包装函数还可以包括第二参数。该第二参数可用于指示(或可以为)函数地址。例如,第二参数可以是前文提到的eax。
作为一个具体的示例,假设第一调用指令为calleax,则该第一调用指令的包装函数可以为call wrap_dispatch(dispatch_env, eax)。其中,dispatch_env即为上文提到的第一参数,eax即为上文提到的第二参数。
第一参数的取值可以由目标机器上的动态加载器在加载第一软件时提供。也可以说,第一参数的内容可以由目标机器上的动态加载器在加载第一软件时填充。作为一个示例,可以在系统初始化的时候,先利用动态加载器对第一软件的可执行程序进行加载。动态加载器本质上是一个可执行程序,可以负责将可执行程序以及可执行程序相关的共享库一起加载至目标机器,以使它们能够正确执行。例如,/lib64/ld-linux-x86-64.so.2即是64位linux系统下的动态加载器。动态加载器在完成加载任务之后,可以获知该可执行程序在加载时内存中的所有代码的类型。例如,动态加载器可以获知内存中的哪段代码为源二进制代码,哪段代码为源二进制代码翻译后得到的目标二进制代码,哪段代码为系统原生(native)库的代码。作为一个例子,动态加载器在加载可执行程序时,可以得到如下信息:内存中的地址范围0x10000-0x20000是源二进制代码的代码段;地址范围0x30000-0x40000是arm平台原生库libc.so的代码段;地址范围x50000-0x60000是翻译后的目标二进制代码的代码段。
在一些实施例中,可以以基本块为单位(或粒度)对源二进制代码进行翻译。在另一些实施例中,可以以函数为单位(或粒度)对源二进制代码进行翻译。基本块的粒度较细,以基本块为粒度进行翻译会导致静态翻译后的代码无法在更高的粒度(如函数粒度)上进行优化,从而导致优化的效果有限。因此,本申请实施例优选以函数为粒度对源二进制代码进行翻译,不需要再将函数切分成基本块。
为了实现以函数为粒度进行静态翻译,需要先对源二进制代码中的函数进行识别。下面结合图2,对本申请实施例提供的函数识别方式进行详细地举例说明。
参见图2,在步骤S210,根据源二进制代码中的符号表对源二进制代码中的函数进行识别,得到一个函数集合。本申请实施例将该函数集合称为FuncGlobals,并将FuncGlobals中的函数称为全局函数。
FuncGlobals可以为识别出的函数的“函数地址+函数长度”的集合。FuncGlobals初始可以为空。FuncGlobals中的函数可以通过解析包含源二进制代码的elf文件中的符号表获得。这里提到的符号表可以包括elf文件中的.symtab和/或.dynsym。
例如,可以先解析elf文件,以确定该elf文件是否包含.symtab符号表。如果有,则可以从该符号表中得到该elf文件包含的大部分函数。在解析了.symtab符号表之后,可以继续执行步骤S220。
或者,在一些实施例中,如果elf文件不包含.symtab符号表,可以解析.dynsym符号表。例如,可以读取elf.dynsym中函数的首地址以及main函数的首地址,并将这些函数添加至FuncGlobals。
在步骤S220,根据FuncGlobals中的每个函数的内部调用指令对源二进制代码中的函数进行识别,得到另一函数集合。本申请实施例将该另一函数集合称为FuncLocals,并将FuncGlobals中的函数称为局部函数。
FuncLocals可以为识别出的函数的“函数地址+函数长度”的集合。FuncLocals初始可以为空。FuncLocals中的函数可以通过遍历FuncGlobals中的各个全局函数的内部指令获得。
例如,可以遍历FuncGlobals中的每个全局函数,并对每个函数进行解码。如果发现某个函数包含elf文件内部代码的调用指令,并且该指令所指向的地址不在该函数以及plt表的范围内,则说明该函数是elf文件内的一个局部函数,把该局部函数的信息(函数地址,函数长度)加入FuncLocals。在未确定局部函数的长度之前,可以先将局部函数的函数长度的取值设置为0。
接下来,可以进行函数边界的识别,以确定该局部函数的函数长度。例如,可以逐条指令解码,并将指令长度记录到inst_len中。在解码过程中,如果遇到retq指令,则可以认为该局部函数结束。又如,如果遇到jump指令,则可以继续往前读,如果接下来四条指令有push rbp,mov %rsp,%rbp或者retq指令,则该函数在jump处已经结束。在函数边界识别结束之后,可以记录(函数地址,函数长度)到FuncLocals中。
此外,在解码过程中,如果遇到call指令或jump指令,且该指令的目标地址在elf文件的text段内,但不在elf的plt段中,则可以将目标地址处的函数作为局部函数,添加至FuncLocals中。对FuncLocals中的每个函数重复执行上述函数边界的识别操作,直到得到FuncLocals中的每个函数的函数地址和函数长度为止。
在步骤S230,确定第二函数集合和第三函数集合的并集,即可得到源二进制代码中的函数。步骤S230得到的函数即可作为需要进行静态翻译的函数。
在静态翻译之后,在一些实施例中,可以对静态翻译得到的目标二进制代码进行函数级别的优化。例如,可以先将目标二进制代码转换为中间表示(intermediaterepresentation,IR)或称中间代码。该中间表示例如可以是低级虚拟机(low levelvirtual machine,llvm)的中间表示。然后,可以对中间表示进行优化,得到目标二进制代码的优化代码。例如,可以通过llvm的pass对中间表示进行优化,得到优化后的代码。
下面结合图3至图5,更加详细地描述本申请实施例。应注意,图3至图5的例子仅仅是为了帮助本领域技术人员理解本申请实施例,而非要将本申请实施例限于所例示的具体数值或具体场景。本领域技术人员根据所给出的图3至图5的例子,显然可以进行各种等价的修改或变化,这样的修改或变化也落入本申请实施例的范围内。
图3是软件翻译和运行的整体流程示例图。在图3的示例中,第一软件的源二进制代码为x64代码。首先,执行步骤S31,以对该源二进制代码进行静态翻译。静态翻译的整体流程可以包括以下几个过程:函数识别(步骤S32)、静态翻译(步骤S33)以及代码优化(步骤S34)。经过代码优化之后,可以得到静态代码,即目标二进制代码。该目标二进制代码为arm64代码,且该arm64代码包括前文提到的wrap_dispatch函数,即wrap_dispatch(dispatch_env, eax)。
在系统初始化时,参见步骤S35,可以利用动态加载器加载该第一软件。动态加载器加载完成之后,会将内存中的各段代码的性质填充至dispatch_env中,使得wrap_dispatch函数能够获知这一信息。
在第一软件运行的过程中,可以执行wrap_dispatch函数(步骤S36)。然后,wrap_dispatch函数可以根据eax的地址以及dispatch_env的取值,执行不同的处理逻辑。例如,如果该eax的地址指向x64代码(即源二进制代码),则可以执行步骤S37,即通过查询x64代码表(里面记录了x64代码与翻译后的静态代码的对应关系)跳转至静态代码。又如,如果该eax的地址指向未知代码,则可以执行步骤S38,调用动态翻译引擎对该未知代码进行翻译和处理。又如,如果该eax的地址指向arm64代码,则可以执行步骤S39,调用目标机器的arm64代码。
图4是本申请实施例提供的以函数为单位(或粒度)的静态翻译的一个示例,对应于图3中的步骤S33。
参见图4,在步骤S402,选取待处理的函数。后文以待处理的函数为func_a为例进行说明。
在步骤S404,对函数func_a 解码,模拟x64的过程对函数func_a进行翻译,从而将函数func_a翻译成等价的arm64代码。
在步骤S406~S412,处理函数func_a 中的call指令、jump指令等。例如,在步骤S408,确定call指令(或jump指令)调用的函数func_b的地址是否可知(即该地址是否为静态地址,并非在第一软件运行时才能确定)。如果函数func_b的地址为静态地址,且已经得到该静态地址的翻译地址,则直接在目标二进制代码中填入该静态地址;如果目前还没有翻译函数func_b,则可以预留位置loc,并记录(func_a, loc),等翻译到函数func_b的时候,再将func_b的地址的翻译地址填如loc中(参见步骤S410)。如果无法确定函数func_b的地址(比如,如果遇到calleax指令,则可以执行步骤S412,可能无法判断eax的地址),在这种情况下,可以将该call指令(jump指令)翻译成 call wrap_dispatch(dispatch_env,eax)。待执行完步骤S410或步骤S412之后,则可以结束函数func_a的处理流程。
图4是本申请实施例提供的wrap_dispatch函数的执行过程的示例性流程图。
参见图5,在执行图5的步骤之前,可以先对系统进行初始化。在系统进行初始化时,可以利用动态加载器加载第一软件的可执行程序。因此,动态加载器可以获知可执行程序加载的时候内存所有代码的类型(或性质)。比如,动态加载器可以获知内存中的代码为可执行x64代码(源二进制代码),还是x64可执行程序静态翻译后的代码(目标二进制代码),还是系统原生库的代码。
动态加载器在获知上述信息之后,可以利用上述信息为wrap_dispatch函数中的dispatch_env参数赋值,以便wrap_dispatch函数也能够获知内存中的各个代码段范围的类型(或性质)。比如,内存中的位于地址范围0x10000-0x20000的代码段为x64代码段(源二进制代码);内存中的位于地址范围0x30000-0x40000内的代码段为arm平台的原生库libc.so的代码段;内存中的位于地址范围x50000-0x60000内的代码段为翻译后的代码段(目标二进制代码)。
接下来,参见图5中的步骤S502,执行wrap_dispatch(dispatch_env, eax)。下面分三种场景进行讨论。
场景1:eax指向的是待翻译程序自己的代码(即eax指向x64代码),则表明函数F(函数F为wrap_dispatch函数所包装的调用指令所在的函数)和eax指向的代码均为x64平台下的代码,它们遵守的是相同的ABI规范。因此,在翻译之后,二者是可以相互直接调用的。因此,在场景1下,可以继续执行步骤S4504,即wrap_dispatch函数可以直接跳转到eax所指向的代码在翻译后对应的arm64代码处执行。
场景2:eax指向的是待翻译程序所调用的是系统常见基础库的代码,或者arm64平台的原生代码。例如,eax指向的是libc中的打印函数printf。printf是arm64平台处的代码,但是函数F是x64平台的代码。因此,在场景2下,可以执行步骤S506,即先找到ABI转换代码。然后,通过ABI转换代码,把函数F的参数,从x64代码转化为arm64代码,然后再跳转到printf去执行。
场景3: eax指向的是未知代码(如待翻译程序自己运行期间生成的代码)。在场景3下,可以执行步骤S508,即由动态翻译引擎去执行该未知代码。
除了前文提到的三种场景之外,还可以包括场景4,eax指向翻译代码(如源二进制程序的翻译代码,或运行过程中动态生成的翻译代码)。在这种情况下,与场景1类似,可以直接跳转至该翻译代码。
上文结合图1至图5,详细描述了本申请的方法实施例,下面结合图6和图7,详细描述本申请的装置实施例。应理解,方法实施例的描述与装置实施例的描述相互对应,因此,未详细描述的部分可以参见前面方法实施例。
图6是本申请实施例提供的运行软件的装置的结构示意图。图6的装置600可用于将第一软件从源机器移植至目标机器,所述源机器的处理器基于第一指令集架构,所述目标机器的处理器基于第二指令集架构,所述第一指令集架构与所述第二指令集架构不同,装置600可以包括翻译模块610和运行模块620。
翻译模块610可用于对所述第一软件的源二进制代码进行静态翻译,得到目标二进制代码,其中所述源二进制代码为基于所述第一指令集架构的代码,所述目标二进制代码为基于所述第二指令集架构的代码,所述源二进制代码包括第一调用指令,所述第一调用指令所调用的函数地址由所述第一软件在运行过程中动态生成,在所述目标二进制代码中,所述第一调用指令被翻译成第二调用指令,所述第二调用指令用于调用所述第一调用指令的包装函数。
运行模块620可用于在所述目标机器上运行所述第一软件,并在运行所述第一软件的过程中执行所述包装函数,以执行以下操作:响应于所述函数地址指向所述源二进制代码,跳转至所述目标二进制代码中的与所述函数地址对应的翻译地址;和/或,响应于所述函数地址指向所述第一软件运行期间生成的代码,调用动态翻译引擎对所述第一软件运行期间生成的代码进行翻译。
在一些实施例中,所述包装函数还用于执行以下操作:响应于所述函数地址指向所述第二指令集架构的代码,对所述第一调用指令进行ABI转换,得到转换后的调用指令,并执行所述转换后的调用指令;和/或响应于所述函数地址指向所述第一指令集架构的代码,对所述第一调用指令进行ABI转换,得到所述第一调用指令的等价指令,并执行所述等价指令。
在一些实施例中,所述包装函数包括第一参数和第二参数,所述第一参数用于指示内存中的代码的类型,所述第二参数用于指示所述函数地址,其中所述函数地址指向的代码的类型包括以下类型中的一种或多种:第一类型,表示所述函数地址指向所述源二进制代码;第二类型,表示所述函数地址指向所述第一软件运行期间生成的代码;第三类型,表示所述源二进制代码翻译过程中生成的翻译代码;以及第四类型,表示所述函数地址指向所述第二指令集架构的代码。
在一些实施例中,所述第一参数的取值由所述目标机器上的动态加载器在加载所述第一软件时提供。
在一些实施例中,所述翻译模块610用于对所述源二进制代码中的函数进行识别,得到第一函数集合;针对所述第一函数集合中的函数,以函数为单位进行所述静态翻译。
在一些实施例中,所述翻译模块610用于根据所述源二进制代码中的符号表对所述源二进制代码中的函数进行识别,得到第二函数集合;根据所述第二函数集合中的每个函数的内部调用指令对所述源二进制代码中的函数进行识别,得到第三函数集合;确定所述第二函数集合和所述第三函数集合的并集,得到所述第一函数集合。
在一些实施例中,装置600还可以包括:转换模块,用于将所述目标二进制代码转换为中间表示;优化模块,用于对所述中间表示进行优化,得到所述目标二进制代码的优化代码。
在一些实施例中,第一调用指令包括call指令和jump指令中的一种或多种。
图7是本申请实施例的装置的示意性结构图。图7中的虚线表示该单元或模块为可选的。该装置700可用于实现上述方法实施例中描述的方法。装置700可以是计算机或任意类型的电子设备。
装置700可以包括一个或多个处理器710。该处理器710可支持装置700实现前文方法实施例所描述的方法。该处理器710可以是通用处理器或者专用处理器。例如,该处理器可以为中央处理单元(central processing unit,CPU)。或者,该处理器还可以是其他通用处理器、数字信号处理器(digital signal processor,DSP)、专用集成电路(applicationspecific integrated circuit,ASIC)、现成可编程门阵列(field programmable gatearray,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
装置700还可以包括一个或多个存储器720。存储器720上存储有程序,该程序可以被处理器710执行,使得处理器710执行前文方法实施例所描述的方法。存储器720可以独立于处理器710也可以集成在处理器710中。
装置700还可以包括收发器730。处理器710可以通过收发器730与其他设备进行通信。例如,处理器710可以通过收发器730与其他设备进行数据收发。
本申请实施例还提供一种机器可读存储介质,用于存储程序。该计算机可读存储介质可应用于本申请实施例提供的终端设备或网络设备中,并且该程序使得计算机执行本申请各个实施例中的由终端设备或网络设备执行的方法。
本申请实施例还提供一种计算机程序产品。该计算机程序产品包括程序。该计算机程序产品可应用于本申请实施例提供的终端设备或网络设备中,并且该程序使得计算机执行本申请各个实施例中的由终端设备或网络设备执行的方法。
本申请实施例还提供一种计算机程序。该计算机程序可应用于本申请实施例提供的终端设备或网络设备中,并且该计算机程序使得计算机执行本申请各个实施例中的由终端设备或网络设备执行的方法。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其他任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本公开实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(Digital Subscriber Line,DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如数字视频光盘(Digital Video Disc,DVD))、或者半导体介质(例如固态硬盘(Solid State Disk,SSD))等。
本领域普通技术人员可以意识到,结合本公开实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本公开的范围。
在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以所述权利要求的保护范围为准。
Claims (16)
1.一种运行软件的方法,其特征在于,所述方法用于将第一软件从源机器移植至目标机器,所述源机器的处理器基于第一指令集架构,所述目标机器的处理器基于第二指令集架构,所述第一指令集架构与所述第二指令集架构不同,
所述方法包括:
对所述第一软件的源二进制代码进行静态翻译,得到目标二进制代码,其中所述源二进制代码为基于所述第一指令集架构的代码,所述目标二进制代码为基于所述第二指令集架构的代码,所述源二进制代码包括第一调用指令,所述第一调用指令所调用的函数地址由所述第一软件在运行过程中动态生成,在所述目标二进制代码中,所述第一调用指令被翻译成第二调用指令,所述第二调用指令用于调用所述第一调用指令的包装函数;
在所述目标机器上运行所述第一软件,并在运行所述第一软件的过程中执行所述包装函数,以执行以下操作:
响应于所述函数地址指向所述源二进制代码,跳转至所述目标二进制代码中的与所述函数地址对应的翻译地址;
响应于所述函数地址指向所述第一软件运行期间生成的代码,调用动态翻译引擎对所述第一软件运行期间生成的代码进行翻译;
响应于所述函数地址指向所述第二指令集架构的代码,对所述第一调用指令进行ABI转换,得到转换后的调用指令,并执行所述转换后的调用指令;和/或
响应于所述函数地址指向所述第一指令集架构的代码,对所述第一调用指令进行ABI转换,得到所述第一调用指令的等价指令,并执行所述等价指令。
2.根据权利要求1所述的方法,其特征在于,所述包装函数包括第一参数和第二参数,所述第一参数用于指示内存中的代码的类型,所述第二参数用于指示所述函数地址,其中所述函数地址指向的代码的类型包括以下类型中的一种或多种:
第一类型,表示所述函数地址指向所述源二进制代码;
第二类型,表示所述函数地址指向所述第一软件运行期间生成的代码;
第三类型,表示所述源二进制代码翻译过程中生成的翻译代码;以及
第四类型,表示所述函数地址指向所述第二指令集架构的原生代码。
3.根据权利要求2所述的方法,其特征在于,所述第一参数的取值由所述目标机器上的动态加载器在加载所述第一软件时提供。
4.根据权利要求1所述的方法,其特征在于,所述对所述第一软件的源二进制代码进行静态翻译,包括:
对所述源二进制代码中的函数进行识别,得到第一函数集合;
针对所述第一函数集合中的函数,以函数为单位进行所述静态翻译。
5.根据权利要求4所述的方法,其特征在于,所述对所述源二进制代码中的函数进行识别,得到第一函数集合,包括:
根据所述源二进制代码中的符号表对所述源二进制代码中的函数进行识别,得到第二函数集合;
根据所述第二函数集合中的每个函数的内部调用指令对所述源二进制代码中的函数进行识别,得到第三函数集合;
确定所述第二函数集合和所述第三函数集合的并集,得到所述第一函数集合。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:
将所述目标二进制代码转换为中间表示;
对所述中间表示进行优化,得到所述目标二进制代码的优化代码。
7.根据权利要求1所述的方法,其特征在于,所述第一调用指令包括call指令、jump指令和条件跳转指令中的一种或多种。
8.一种运行软件的装置,其特征在于,所述装置用于将第一软件从源机器移植至目标机器,所述源机器的处理器基于第一指令集架构,所述目标机器的处理器基于第二指令集架构,所述第一指令集架构与所述第二指令集架构不同,
所述装置包括:
翻译模块,用于对所述第一软件的源二进制代码进行静态翻译,得到目标二进制代码,其中所述源二进制代码为基于所述第一指令集架构的代码,所述目标二进制代码为基于所述第二指令集架构的代码,所述源二进制代码包括第一调用指令,所述第一调用指令所调用的函数地址由所述第一软件在运行过程中动态生成,在所述目标二进制代码中,所述第一调用指令被翻译成第二调用指令,所述第二调用指令用于调用所述第一调用指令的包装函数;
运行模块,用于在所述目标机器上运行所述第一软件,并在运行所述第一软件的过程中执行所述包装函数,以执行以下操作:
响应于所述函数地址指向所述源二进制代码,跳转至所述目标二进制代码中的与所述函数地址对应的翻译地址;
响应于所述函数地址指向所述第一软件运行期间生成的代码,调用动态翻译引擎对所述第一软件运行期间生成的代码进行翻译;
响应于所述函数地址指向所述第二指令集架构的代码,对所述第一调用指令进行ABI转换,得到转换后的调用指令,并执行所述转换后的调用指令;和/或
响应于所述函数地址指向所述第一指令集架构的代码,对所述第一调用指令进行ABI转换,得到所述第一调用指令的等价指令,并执行所述等价指令。
9.根据权利要求8所述的装置,其特征在于,所述包装函数包括第一参数和第二参数,所述第一参数用于指示内存中的代码的类型,所述第二参数用于指示所述函数地址,其中所述函数地址指向的代码的类型包括以下类型中的一种或多种:
第一类型,表示所述函数地址指向所述源二进制代码;
第二类型,表示所述函数地址指向所述第一软件运行期间生成的代码;
第三类型,表示所述源二进制代码翻译过程中生成的翻译代码;以及
第四类型,表示所述函数地址指向所述第二指令集架构的代码。
10.根据权利要求9所述的装置,其特征在于,所述第一参数的取值由所述目标机器上的动态加载器在加载所述第一软件时提供。
11.根据权利要求8所述的装置,其特征在于,所述翻译模块用于对所述源二进制代码中的函数进行识别,得到第一函数集合;针对所述第一函数集合中的函数,以函数为单位进行所述静态翻译。
12.根据权利要求11所述的装置,其特征在于,所述翻译模块用于根据所述源二进制代码中的符号表对所述源二进制代码中的函数进行识别,得到第二函数集合;根据所述第二函数集合中的每个函数的内部调用指令对所述源二进制代码中的函数进行识别,得到第三函数集合;确定所述第二函数集合和所述第三函数集合的并集,得到所述第一函数集合。
13.根据权利要求8所述的装置,其特征在于,所述装置还包括:
转换模块,用于将所述目标二进制代码转换为中间表示;
优化模块,用于对所述中间表示进行优化,得到所述目标二进制代码的优化代码。
14.根据权利要求8所述的装置,其特征在于,所述第一调用指令包括call指令、jump指令和条件跳转指令中的一种或多种。
15.一种运行软件的装置,其特征在于,包括:
存储器,用于存储指令;
处理器,用于执行所述存储器中存储的指令,以执行如权利要求1-7中任一项所述的方法。
16.一种机器可读存储介质,其特征在于,其上存储有用于执行如权利要求1-7中任一项所述的方法的指令。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210381743.2A CN114461227B (zh) | 2022-04-13 | 2022-04-13 | 运行软件的方法、装置以及机器可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210381743.2A CN114461227B (zh) | 2022-04-13 | 2022-04-13 | 运行软件的方法、装置以及机器可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114461227A CN114461227A (zh) | 2022-05-10 |
CN114461227B true CN114461227B (zh) | 2022-07-12 |
Family
ID=81418538
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210381743.2A Active CN114461227B (zh) | 2022-04-13 | 2022-04-13 | 运行软件的方法、装置以及机器可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114461227B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117555555B (zh) * | 2024-01-11 | 2024-04-12 | 龙芯中科技术股份有限公司 | 例外处理方法、装置、电子设备及存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114115990A (zh) * | 2021-12-02 | 2022-03-01 | 华东师范大学 | 动静结合二进制翻译的程序迁移方法、系统及存储介质 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20110035601A1 (en) * | 2007-12-21 | 2011-02-10 | University Of Virginia Patent Foundation | System, method and computer program product for protecting software via continuous anti-tampering and obfuscation transforms |
CN101452396B (zh) * | 2008-12-25 | 2012-04-25 | 上海交通大学 | 结合静态优化的动态二进制翻译方法 |
CN102073533B (zh) * | 2011-01-14 | 2013-06-19 | 中国人民解放军国防科学技术大学 | 支持动态二进制翻译的多核体系结构 |
KR101665219B1 (ko) * | 2012-03-22 | 2016-10-11 | 인텔 코포레이션 | 네스티드 에뮬레이션 및 동적 링킹 환경 |
CN103235724A (zh) * | 2013-05-10 | 2013-08-07 | 中国人民解放军信息工程大学 | 基于原子操作语义描述的多源二进制代码一体化翻译方法 |
US20150379169A1 (en) * | 2014-06-27 | 2015-12-31 | Yong Wu | Efficient emulation for pseudo-wrapped callback handling in binary translation software |
US10395033B2 (en) * | 2016-09-30 | 2019-08-27 | Intel Corporation | System, apparatus and method for performing on-demand binary analysis for detecting code reuse attacks |
CN106873944A (zh) * | 2016-12-23 | 2017-06-20 | 北京北大众志微系统科技有限责任公司 | 在动态二进制翻译系统中处理间接转移指令的方法和装置 |
CN111625279A (zh) * | 2020-04-27 | 2020-09-04 | 中国人民解放军战略支援部队信息工程大学 | 基于动态链接库的动静融合二进制翻译方法及系统 |
CN114047960A (zh) * | 2021-11-10 | 2022-02-15 | 北京鲸鲮信息系统技术有限公司 | 操作系统运行方法及装置、电子设备和存储介质 |
-
2022
- 2022-04-13 CN CN202210381743.2A patent/CN114461227B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114115990A (zh) * | 2021-12-02 | 2022-03-01 | 华东师范大学 | 动静结合二进制翻译的程序迁移方法、系统及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN114461227A (zh) | 2022-05-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107077337B (zh) | 用于执行根据两个指令集架构编译的应用编码的系统和方法 | |
CN107291480B (zh) | 一种函数调用方法及装置 | |
CA2082065C (en) | Cross-image referencing of program code | |
CN111399990B (zh) | 解释执行智能合约指令的方法及装置 | |
RU2731327C1 (ru) | Команда защищенной логической загрузки и сдвига | |
JP4601665B2 (ja) | 条件付で実行可能モジュールを縮小するシステムおよび方法 | |
US9158566B2 (en) | Page mapped spatially aware emulation of computer instruction set | |
RU2728849C1 (ru) | Обработка события защищенного сохранения в ходе транзакционного выполнения | |
EP1380946A2 (en) | Program code conversion with reduced translation | |
RU2727614C1 (ru) | Загрузка и сохранение элементов управления, регулирующих функционирование средства защищенного сохранения | |
JP2007535241A5 (zh) | ||
CN104246695A (zh) | 嵌套仿真和动态链接环境 | |
US20180203620A1 (en) | Identifying processor attributes based on detecting a guarded storage event | |
CN114461227B (zh) | 运行软件的方法、装置以及机器可读存储介质 | |
CN117075960B (zh) | 程序重构方法、应用跨平台迁移方法、装置与计算设备 | |
US8589899B2 (en) | Optimization system, optimization method, and compiler program | |
CN111610966A (zh) | 程序的运行方法、装置和计算设备 | |
CN115700470A (zh) | 文件加载的处理方法和装置,计算机存储介质和电子设备 | |
CN115292721B (zh) | 一种安卓兼容环境适配多Linux内核的启动方法 | |
CN106897588B (zh) | 一种标签函数的处理方法及装置 | |
CN114461306A (zh) | 运行软件的方法、装置及机器可读存储介质 | |
US10203942B2 (en) | Binary-code translation device and method | |
CN115421875B (zh) | 二进制翻译方法及装置 | |
CN115421876B (zh) | 二进制翻译方法及装置 | |
CN111209056B (zh) | 功能函数的加载方法、装置、可读存储介质及电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |