运行软件的方法、装置及机器可读存储介质与流程

文档序号:29957573发布日期:2022-05-11 08:20阅读:79来源:国知局
运行软件的方法、装置及机器可读存储介质与流程

1.本技术涉及软件处理领域,具体涉及一种运行软件的方法、装置及机器可读存储介质。


背景技术:

2.很多软件包括主程序、专有动态库以及公共动态库等多个组成部分。很多动态库都以第三方闭源发布方式其功能,这些闭源发布的动态库,在更换到不同指令集架构的处理器后,其提供的功能就无法执行和使用,甚至由于某些动态库提供的功能复杂而无法移植,或是因代码老旧、丢失,无人继续维护等原因,这些动态库将无法在具有新的指令集平台的新程序中继续发挥作用,从而造成浪费。


技术实现要素:

3.本技术实施例提供一种运行软件的方法、装置及机器可读存储介质。
4.第一方面,提供一种运行软件的方法,所述方法用于将目标软件从源机器移植至目标机器,所述源机器的处理器基于第一指令集架构,所述目标机器的处理器基于第二指令集架构,所述第一指令集架构与所述第二指令集架构不同,所述方法包括:在所述目标机器上加载所述目标软件的主程序;响应于所述主程序调用所述目标软件的专有动态库,调用所述专有动态库的翻译代码;其中,所述目标软件的主程序基于所述第二指令集架构,所述专有动态库基于所述第一指令集架构。
5.作为一种可能的实现方式,所述方法还包括:响应于所述专有动态库调用所述目标软件的公共动态库,调用所述目标机器的原生公共动态库。
6.作为一种可能的实现方式,所述方法还包括:对所述专有动态库的导入函数的地址进行重定向,使得所述导入函数的地址指向第一指令片段的地址;所述响应于所述专有动态库调用所述目标软件的公共动态库,调用所述目标机器的原生公共动态库,包括:响应于所述专有动态库调用所述导入函数,利用所述导入函数的地址确定所述第一指令片段的地址;对所述第一指令片段进行abi转换,得到第二指令片段,所述第二指令片段指向所述目标机器的原生公共动态库;利用所述第二指令片段调用所述目标机器的原生公共动态库。
7.作为一种可能的实现方式,所述方法还包括:响应于所述主程序调用所述目标软件的公共动态库,直接调用所述目标机器的原生公共动态库。
8.作为一种可能的实现方式,所述方法还包括:对所述专有动态库的导出函数的地址进行重定向,使得所述导出函数的地址指向第三指令片段的地址;所述响应于所述主程序调用所述目标软件的专有动态库,调用所述专有动态库的翻译代码,包括:响应于所述主程序调用所述导出函数,利用所述导出函数的地址确定所述第三指令片段的地址;对所述第三指令片段进行abi转换,得到第四指令片段,其中,所述第四指令片段指向所述翻译代码;利用所述第四指令片段调用所述翻译代码。
9.作为一种可能的实现方式,所述响应于所述主程序调用所述目标软件的专有动态库,调用所述专有动态库的翻译代码,包括:响应于所述主程序调用所述目标软件的专有动态库,调用所述目标机器上的翻译引擎动态库;利用所述翻译引擎动态库对所述专有动态库进行翻译,得到所述专有动态库的翻译代码;调用所述专有动态库的翻译代码。
10.作为一种可能的实现方式,所述方法还包括:加载所述目标软件的动态库;根据所述目标软件的动态库的elf文件,识别所述目标软件的动态库所基于的指令集架构;如果所述目标软件的动态库基于所述第一指令集架构,调用翻译引擎动态库对所述目标软件的动态库进行翻译和重定向,以定位所述目标软件的动态库的翻译代码;如果所述目标软件的动态库基于所述第二指令集架构,直接定位所述目标软件的动态库。
11.作为一种可能的实现方式,所述主程序为所述目标机器的原生语言虚拟机。
12.作为一种可能的实现方式,所述原生语言虚拟机为java虚拟机或.net虚拟机。
13.作为一种可能的实现方式,所述第一指令集架构与所述第二指令集架构中的一个为x86指令集架构,所述第一指令集架构与所述第二指令集架构中的另一个为arm指令集架构。
14.第二方面,提供一种运行软件的装置,所述装置用于将目标软件从源机器移植至目标机器,所述源机器的处理器基于第一指令集架构,所述目标机器的处理器基于第二指令集架构,所述第一指令集架构与所述第二指令集架构不同,所述装置包括:加载模块,用于在所述目标机器上加载所述目标软件的主程序;第一调用模块,用于响应于所述主程序调用所述目标软件的专有动态库,调用所述专有动态库的翻译代码;其中,所述目标软件的主程序基于所述第二指令集架构,所述专有动态库基于所述第一指令集架构。
15.作为一种可能的实现方式,所述装置还包括:第二调用模块,用于响应于所述专有动态库调用所述目标软件的公共动态库,调用所述目标机器的原生公共动态库。
16.作为一种可能的实现方式,所述装置还包括:第一重定向模块,用于对所述专有动态库的导入函数的地址进行重定向,使得所述导入函数的地址指向第一指令片段的地址;所述第二调用模块用于响应于所述专有动态库调用所述导入函数,利用所述导入函数的地址确定所述第一指令片段的地址;对所述第一指令片段进行abi转换,得到第二指令片段,所述第二指令片段指向所述目标机器的原生公共动态库;利用所述第二指令片段调用所述目标机器的原生公共动态库。
17.作为一种可能的实现方式,所述装置还包括:第三调用模块,用于响应于所述主程序调用所述目标软件的公共动态库,直接调用所述目标机器的原生公共动态库。
18.作为一种可能的实现方式,所述装置还包括:第二重定向模块,用于对所述专有动态库的导出函数的地址进行重定向,使得所述导出函数的地址指向第三指令片段的地址;所述第一调用模块用于响应于所述主程序调用所述导出函数,利用所述导出函数的地址确定所述第三指令片段的地址;对所述第三指令片段进行abi转换,得到第四指令片段,其中,所述第四指令片段指向所述翻译代码;利用所述第四指令片段调用所述翻译代码。
19.作为一种可能的实现方式,所述第一调用模块还用于响应于所述主程序调用所述目标软件的专有动态库,调用所述目标机器上的翻译引擎动态库;利用所述翻译引擎动态库对所述专有动态库进行翻译,得到所述专有动态库的翻译代码;调用所述专有动态库的翻译代码。
20.作为一种可能的实现方式,所述装置还包括:加载模块,用于加载所述目标软件的动态库;根据所述目标软件的动态库的elf文件,识别所述目标软件的动态库所基于的指令集架构;如果所述目标软件的动态库基于所述第一指令集架构,调用翻译引擎动态库对所述目标软件的动态库进行翻译和重定向,以定位所述目标软件的动态库的翻译代码;如果所述目标软件的动态库基于所述第二指令集架构,直接定位所述目标软件的动态库。
21.作为一种可能的实现方式,所述主程序为所述目标机器的原生语言虚拟机。
22.作为一种可能的实现方式,所述原生语言虚拟机为java虚拟机或.net虚拟机。
23.作为一种可能的实现方式,所述第一指令集架构与所述第二指令集架构中的一个为x86指令集架构,所述第一指令集架构与所述第二指令集架构中的另一个为arm指令集架构。
24.第三方面,提供一种运行软件的装置,包括:存储器,用于存储指令;处理器,用于执行所述存储器中存储的指令,以执行如第一方面或第一方面中的任意一种可能的实现方式所述的方法。
25.第四方面,提供一种机器可读存储介质,其上存储有用于执行如第一方面或第一方面中的任意一种可能的实现方式所述的方法的指令。
26.第五方面,提供一种程序产品,包括用于执行如第一方面或第一方面中的任意一种可能的实现方式所述的方法的指令。
27.本技术实施例在目标机器上直接加载目标软件的主程序(与目标机器基于相同的指令集架构),而不需要对该主程序进行翻译,从而能够提升软件在目标机器上的执行性能。
28.本技术实施例在新的指令集平台(对应于前文描述的目标机器)的软件进程(对应于前文中的主程序)中,直接加载已有的基于其他指令集架构的动态库(对应于前文描述的第一指令集架构的专有动态库),从而可以有效利用已有的不同指令集架构的动态库,丰富新指令平台的软件功能,这些动态库可以在具有新的指令集平台的新程序中继续发挥作用,从而避免浪费。
附图说明
29.为了更清楚地说明本技术实施例或背景技术中的技术方案,下面将对本技术实施例或背景技术中所需要使用的附图进行说明。
30.图1是基于语言虚拟机的软件的整体结构示例图。
31.图2是本技术实施例提供的运行软件的方法的流程示意图。
32.图3是利用本技术实施例将图1所示的软件从源机器移植到目标机器之后得到的软件的整体结构示例图。
33.图4是本技术实施例提供的导出函数的重定向操作的流程示意图。
34.图5是在未对图3中的专有动态库的导入函数和导出函数的地址进行重定向时的函数调用关系示例图。
35.图6是对图3中的专有动态库的导入函数和导出函数的地址进行重定向之后的函数调用关系示例图。
36.图7是本技术实施例提供的导入函数的重定向操作的流程示意图。
37.图8是本技术实施例提供的运行软件的装置的流程示意图。
38.图9是本技术实施例提供的装置的结构示意图。
具体实施方式
39.为了便于理解,先对本技术实施例涉及的基本概念进行解释。
40.二进制翻译(binary translation)技术可将一种指令集架构(instruction set architecture,isa)中的指令序列转化成另一种指令集架构中的指令序列。例如,二进制翻译可以将x86指令集架构中的指令序列翻译成arm指令集架构(如arm64)中的指令序列。
41.二进制翻译包括静态翻译和动态翻译两种。静态翻译是在源机器的二进制程序文件a执行之前,对该二进制程序文件a进行翻译,以将该二进制程序文件a翻译成目标机器(目标机器的处理器基于的指令集架构与源机器的处理器基于的指令集架构不同)上的二进制程序文件b。基于静态翻译技术,一次翻译得到的翻译结果可以被多次使用。动态翻译是在二进制程序运行时对执行到的片段进行翻译。当该二进制程序进行重启之后,需要对二进制程序文件进行重新翻译。
42.有些软件包括主程序、专有动态库和公共动态库。主程序通过调用专有动态库和公共动态库,共同完成软件的功能。下面以基于语言虚拟机的软件为例进行说明。在基于语言虚拟机的软件中,主程序即为该语言虚拟机。
43.语言虚拟机(或称语言级虚拟机)是一种解释执行中间码或者将中间码编译成机器码运行的虚拟计算机软件。语言虚拟机的种类很多,常见的语言虚拟机包括java虚拟机和.net虚拟机。语言虚拟机可以屏蔽操作系统平台相关的信息,从而具有可以在不同的操作系统平台之间运行的优点。因此,目前市面上的很多软件均基于语言虚拟机进行开发。
44.图1以基于java虚拟机的软件10为例,给出基于语言虚拟机的软件的整体结构的一个示例。如图1所示,该软件10运行在基于x86指令集架构的机器上。该软件10主要包括三部分:java虚拟机12,专有动态库14以及公共动态库16。
45.java虚拟机12可以通过在实际的计算机上仿真模拟各种计算机功能来实现。java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等。java虚拟机还具可以有相应的指令系统。java虚拟机屏蔽了与具体操作系统平台相关的信息,使得java程序只需生成在java虚拟机上运行的目标代码(字节码),就可以在多种操作系统平台上不加修改地运行。
46.专有动态库14可用于存储与软件10自身的业务逻辑相关的代码或函数。也就是说,可以将执行软件10自身的业务逻辑所需的代码做成专有动态库,供java虚拟机12调用。
47.公共动态库16也可称为第三方系统动态库。公共动态库16可以包括两种类型的公共动态库。第一种类型的动态库为java虚拟机12直接调用的公共动态库,如图1中的公共动态库一16a和公共动态库二16b。第二种类型的动态库为专有动态库14调用的公共动态库,如图1中的公共动态库三16c和公共动态库四16d。
48.专有动态库14可以包括导出函数表和导入函数表(图中未示出)。java虚拟机12可以基于导出函数表对专有动态库14中的函数进行调用。专有动态库14可以基于导入函数表对公共动态库三16c、公共动态库四16d进行调用。
49.当希望将软件从源机器移植到目标机器上运行时,如果源机器与目标机器的处理器所基于的指令集架构不同,则会遇到软件兼容性方面的问题。指令集架构不同指的是处
理器的架构设计不同。这种架构设计方面的不同会导致基于一种指令集架构开发的二进制程序无法直接在基于另一种指令集架构的处理器或机器上运行。例如,如果希望将基于x86指令集架构的软件移植到基于arm64指令集架构的机器上运行,则会遇到软件无法直接运行的问题。
50.针对上述问题,一种可能的解决方式为对软件的各个部分(包括上文提到的主程序、专有动态库和公共动态库)均进行二进制翻译。但是,对软件的所有部分均进行翻译使得翻译的工作量较大,而且被翻译的软件生成的中间代码仍然需要进一步翻译,这样会导致软件在目标机器上的执行性能较差。
51.以上文提到的基于语言虚拟机的软件为例进行说明。基于语言虚拟机的软件可能包含语言虚拟机、专有动态库以及公共动态库三部分。因此,在对基于语言虚拟机的软件进行二进制翻译时,相关技术对语言虚拟机、专有动态库以及公共动态库均进行静态或动态的二进制翻译。语言虚拟机在运行过程中会产生新的机器码,因此,如果对语言虚拟机进行二进制翻译,则该语言虚拟机在运行时产生新的机器码也是需要进行二进制翻译的,这样会导致翻译执行性能非常差。例如,对于很多基于语言虚拟机的软件而言,其在目标机器上的执行性能可能只能达到其在源机器上的执行性能的10%,甚至更低。上述问题的存在经常导致基于语言虚拟机的软件在进行二进制翻译之后无法正常使用。
52.为了提升软件在二进制翻译后的执行性能,本技术实施例不对软件的主程序进行二进制翻译,该主程序可以直接使用目标机器上的原生应用程序(即与目标机器基于相同指令集架构的应用程序)。这样一方面可以避免目标软件的主程序的翻译,而且无需对主程序运行过程中产生的临时代码进行翻译。
53.下文对本技术实施例进行详细描述。为了便于描述,后文将待移植的软件称为目标软件。本技术实施例对目标软件的功能或类型不作具体限定。作为一个示例,该目标软件可以是图形处理软件。作为另一示例,该目标软件也可以为游戏软件或其他类型的软件。该目标软件可以是在linux系统环境下运行的软件,也可以是在windows系统环境下运行的软件。
54.该目标软件可以包括以下中的一种或多种:主程序、专有动态库以及公共动态库。以目标软件为基于语言虚拟机的软件为例,则该主程序可以是语言虚拟机,如java虚拟机,或者.net虚拟机。当然,该主程序还可以是除语言虚拟机之外的其他类型的应用程序。该主程序在运行时可以调用目标软件的专有动态库和/或公共动态库,从而实现目标软件的功能。
55.目标软件的专有动态库可以包含实现目标软件功能的部分或全部代码,或者说目标软件的专有动态库可以包含执行目标软件自身的业务逻辑所需的代码。该专有动态库可以供主程序调用,从而执行目标软件的业务逻辑。
56.目标软件的公共动态库可以包括主程序调用的公共动态库,也可以包括目标软件的专有动态库调用的公共动态库。以目标软件为图1所示的基于java虚拟机的软件10为例,该软件10的公共动态库包括java虚拟机12直接调用的公共动态库一16a、公共动态库二16b,也包括专有动态库14调用的公共动态库三16c、公共动态库四16d。
57.图2为本技术实施例提供的运行软件的方法200。该方法200可用于将目标软件从源机器移植(或透明移植)至目标机器。在一些实施例中,图2的方法可用于将多种不同指令
集架构下的不同功能的多种动态库,从源机器移植(或透明移植)至目标机器,使得目标软件在目标机器上运行的过程中,一个进程内可以混合加载并执行该多种不同指令集架构下的不同功能的多种动态库,以获得这些动态库所提供的响应功能。
58.源机器可以指原本运行目标软件的机器。在一些实施例中,源机器也可称为客户机。源机器的处理器可以是基于第一指令集架构的处理器。该第一指令集架构例如可以是x86指令集架构,也可以是arm指令集架构(如arm64)。在图2的实施例中,目标软件是基于第一指令集架构开发的软件,因此,该目标软件可以在源机器上正常运行。
59.目标机器可以指希望移植目标软件的机器。在一些实施例中,目标机器也可称为主机。目标机器的处理器可以是基于第二指令集架构的处理器。该第二指令集架构与第一指令集架构为不同的指令集架构。例如,如果第一指令集架构为x86指令集架构,则第二指令集架构可以为arm指令集架构。又如,如果第一指令集架构为arm指令集架构,则第二指令集架构为x86指令集架构。
60.在对目标软件、源机器、目标机器等概念进行介绍的基础上,下面对图2方法中的各个步骤进行详细描述。图2的方法200包括步骤s210和步骤s220。该步骤s210~步骤s220可以由目标机器执行,例如可以由目标机器上的处理器执行。作为一个示例,步骤s210可以由目标机器上的加载器执行,步骤s220可以由目标机器上的翻译引擎动态库执行。
61.步骤s210,在目标机器上加载目标软件的主程序。目标软件的主程序可以为基于第二指令集架构的程序。该目标软件的主程序可以是目标机器上的原生应用程序(目标机器自带的或目标机器上安装的应用程序)。以目标软件为基于语言虚拟机的软件为例,则该目标软件的主程序可以是目标机器的原生语言虚拟机。根据步骤s210可以看出,本技术实施例并没有对目标软件的主程序进行二进制翻译,而是使用直接在目标机器加载和运行该目标软件。
62.步骤s220,响应于目标软件的主程序调用目标软件的专有动态库,调用该专有动态库的翻译代码。目标软件的专有动态库为基于第一指令集架构的动态库,也就是说,目标软件的主程序与目标软件的专有动态库所基于的指令集架构不同。如果目标软件的主程序调用目标软件的专有动态库,则可以对该调用进行重定向,转而调用专有动态库的翻译代码。本技术实施例对专有动态库的翻译时机不作具体限定。例如,可以在步骤s220之前对专有动态库进行翻译,以得到上述翻译代码。或者,也可以在接收到目标软件的主程序对专有动态库的调用指令之后,触发专有动态库的翻译工作。后文会结合具体的实施例对翻译过程进行详细地举例说明,此处暂不详述。
63.在调用上述专有动态库的翻译代码之前,可以先加载该专有动态库。在加载该专有动态库时,可以主动识别或判定该专有动态库是否为基于第一指令集架构的动态库(第一指令集架构可以包括1~n个指令集架构,以第n个指令集架构为例,这里可以主动判定该专有动态库是否为基于该第n个指令集架构的动态库),并加载。在加载完成之后,可以继续执行步骤s220,以调用该专有动态库的翻译代码。指令集架构的识别可以基于elf文件实现,详见后文的描述。
64.在将目标软件移植到目标机器之后,本技术实施例对目标软件的专有动态库进行了二进制翻译,但没有对目标软件的主程序进行二进制翻译(而是使用了目标机器的原生应用程序)。因此本技术实施例能够提高目标软件移植后的执行性能。
65.此外,本技术实施例在新的指令集平台(对应于前文描述的目标机器)的软件进程(对应于前文中的主程序)中,直接加载已有的基于其他指令集架构的动态库(对应于前文描述的第一指令集架构的专有动态库),从而可以有效利用已有的不同指令集架构的动态库,丰富新指令平台的软件功能,这些动态库可以在具有新的指令集平台的新程序中继续发挥作用,从而避免浪费。
66.前文提到,目标软件除了包括主程序和专有动态库之外,还可以包括公共动态库。为了进一步降低目标软件移植过程中的翻译任务的复杂度,在一些实施例中,可以不对目标软件的公共动态库进行翻译,而是调用目标机器的原生公共动态库。目标机器的原生动态库可以理解为目标机器自带的或目标机器上安装的动态库;或者,目标机器的原生动态库也可以理解为在目标机器上运行的、且与目标机器的处理器基于相同指令集架构的动态库。不对目标软件的公共动态库进行翻译,而是使用目标机器的原生公共动态库,不但可以进一步降低二进制翻译的翻译量,而且能够进一步提高目标软件移植后的执行性能。以目标软件为基于语言虚拟机的软件为例,使用目标机器的原生语言虚拟机以及原生公共动态库,仅对目标软件的专有动态库进行翻译,有可能使得目标软件移植后的执行性能达到移植前的90%以上。
67.前文提到,目标软件的公共动态库包括目标软件的主程序直接调用的公共动态库(如图1中的公共动态库一16a,公共动态库二16b)。在一些实施例中,可以不对主程序直接调用的公共动态库进行二进制翻译,而是直接使用目标机器的原生公共动态库。在该实施例中,由于主程序以及该主程序调用的公共动态库均使用的是目标机器的原生程序代码,二者基于的是相同指令集架构,可以直接进行调用,无需进行应用程序二进制接口(application binary interface,abi)转换。在该实施例中,主程序调用的公共动态库既包括基于第一指令集架构的动态库(如前文提到的专有动态库),也包括基于第二指令集架构的动态库(如目标机器的原生公共动态库)。主程序既可以调用基于第一指令集架构的动态库,也可以调用基于第二指令集架构的动态库。因此,本技术实施例提供的运行软件的方法可以理解为一种多指令集架构(或称多体系结构指令)的混合执行方法。应理解,本技术实施例提及的第一指令集架构并不限于一种指令集架构,可以包括1~n种指令集架构(n为大于1的正整数)。也就是说,本技术实施例提供的运行软件的方法除了可以执行目标机器的指令集架构之外,还可以混合执行一种或多种其他指令集架构的指令。
68.除了主程序直接调用的公共动态库之外,目标软件的公共动态库还可以包括目标软件的专有动态库调用的公共动态库(如图1中的公共动态库三16c,公共动态库四16d)。在一些实施例中,可以不对专有动态库调用的公共动态库进行二进制翻译,而是使用目标机器的原生公共动态库。由于专有动态库与目标机器的原生公共动态库是基于不同的指令集架构开发的动态库,因此,专有动态库在调用目标机器的原生公共动态库之前,可以先进行abi转换。
69.下面以目标软件为图1所示的基于语言虚拟机的软件10,源机器的处理器基于x86指令集架构,目标机器的处理器基于arm64指令集架构为例,对移植后的软件的整体结构进行更为详细地举例说明。
70.图3示出了基于本技术实施例将如图1所示的软件10从源机器移植到目标机器之后的软件整体结构。如图3所示,在软件10移植到图3所示的目标机器之后,软件10的java虚
拟机使用的是基于arm64指令集架构的java虚拟机32,该java虚拟机为目标机器的原生虚拟机。目标机器具有原生公共动态库ⅰ36a、公共动态库ⅱ36b,二者均是基于arm64指令集架构开发的原生公共动态库,因此,该java虚拟机32可以直接调用该公共动态库ⅰ36a、公共动态库ⅱ36b。
71.java虚拟机32通过目标机器上的翻译引擎动态库33对软件10的专有动态库34进行调用。该翻译引擎动态库33可以负责对专有动态库34进行二进制翻译,从而将专有动态库34中的x86指令(elf文件的text段的指令)翻译成相应的arm64指令,从而得到专有动态库的翻译代码35。
72.专有动态库34可以调用目标机器的原生公共动态库ⅲ36c、公共动态库ⅳ36d。由于专有动态库34与公共动态库ⅲ36c、公共动态库ⅳ36d所基于的指令集架构不同,在调用之前,可以先进行abi转换。
73.在java虚拟机32运行之前,可以先利用加载器31加载该java虚拟机32。加载器31还可用于识别java虚拟机32运行时加载的动态库是否为基于x86指令集架构的动态库,如果加载的动态库为基于x86指令集架构的动态库,则可以由加载器31先加载翻译引擎动态库33,并由该翻译引擎动态库33对x86指令集架构的动态库进行动态或静态二进制翻译。
74.对比图1和图3可以看出,图3中的一部分软件(虚框外的部分)直接使用了目标机器上的原生软件,并不需要进行二进制翻译,从而降低了翻译的工作量,提升了翻译后的软件执行性能。
75.在一些实施例中,目标软件的主程序被加载执行之后,该主程序所需的动态库的加载均可以由加载器执行。该加载器在对主程序所需要的动态库进行加载过程中,可以识别动态库是原生公共动态库还是属于第一指令集架构(第一指令集架构可以包括1~n种指令集架构)的专用动态库。如果主程序所需要的动态库为第一指令集架构的专有动态库,则可以将专有动态库的导入函数和/或导出函数进行重定向,以实现代码的正确调用。下文详细描述专有动态库的导入函数和/或导出函数的重定向过程。
76.目标软件的主程序对专有动态库的调用是基于专有动态库中的导出函数表进行的。在调用时,主程序可以利用导出函数的地址找到目标软件的专有动态库(中的函数)的地址。但是,在目标软件在目标机器上运行时,定位到目标软件的专有动态库是没有意义的(这是因为专有动态库基于的是源机器的指令集架构,在目标机器上是无法运行的),而应当定位到该专有动态库的翻译代码。因此,在一些实施例中,可以对导出函数的地址进行重定向,使得主程序对专有动态库的调用被转换为对专有动态库的翻译代码的调用。
77.下面结合图4至图6,对导出函数的地址的重定向方式以及重定向之后的翻译代码的调用流程进行详细地举例说明。
78.参见图4,在步骤s410,对专有动态库的导出函数的地址(该导出函数的地址原本指向目标软件的专有动态库)进行重定向,使得导出函数的地址指向指令片段的地址。该指令片段经过abi转换之后可以指向专有动态库的翻译代码。本技术实施例提及的指令片段可以指序幕指令序列,也可以指一个函数。作为一个示例,该指令片段可以为导出函数的包装函数。
79.本技术实施例对步骤s410的执行时机不作具体限定。在一些实施例中,步骤s410描述的重定向操作可以在加载专有动态库时执行。此外,步骤s410可以由前文提到的翻译
引擎动态库执行。例如,翻译引擎动态库在执行专有动态库的翻译操作之后,可以生成上文提到的指令片段,并对目标软件的专有动态库的导出函数的地址进行修改,使得导出函数的地址指向该指令片段。
80.下面以源机器基于x86指令集架构,目标机器基于arm64指令集架构,目标软件为基于java虚拟机的软件为例,结合图5和图6,对上述重定向操作进行更为详细地举例说明。
81.图5是在翻译引擎动态库未进行翻译和重定向之前的软件调用方式示意图。从图5可以看出,目标机器的原生java虚拟机32在运行目标软件时,基于导出函数表342中的导出函数e_1调用了目标软件的专有动态库34中的函数e_1(x86)。但是,该专有动态库中的函数e_1(x86)是基于x86指令集架构的函数,因此,无法直接在目标机器上运行。
82.图6是翻译引擎动态库执行翻译之后的软件调用方式示意图。在图6的示例中,上文提到的指令片段为包装函数。从图6可以看出,翻译引擎动态库对目标软件进行翻译之后,可以生成导出函数的包装函数表62以及存储翻译代码的翻译缓冲64。该包装函数表62中的包装函数可以与导出函数表342中的导出函数一一对应,且导出函数表342中的各个导出函数的地址指向包装函数表62中的与其对应的包装函数。例如,在图5中,导出函数e_1的地址指向专有动态库的函数e_1(x86)。经过翻译引擎动态库的翻译和重定向,导出函数e_1的地址指向包装函数e_w_1,而包装函数e_w_1的地址经过abi转换之后可以指向翻译缓冲中的函数e_1(arm64)。
83.继续参见图4,在步骤s410之后,可以继续执行步骤s420~步骤s440(对应于图2的步骤s220)。在步骤s420,响应于目标软件的主程序调用专有动态库的导出函数,利用该导出函数的地址确定指令片段的地址。本技术实施例提及的指令片段可以指序幕指令序列,也可以指一个函数。作为一个示例,该指令片段可以为导出函数的包装函数。在步骤s430~s440,对指令片段进行abi,得到另一指令片段(该另一指令片段可以基于第二指令集架构,并指向翻译代码),并利用该另一指令片段调用翻译代码。
84.上文详细描述了目标软件的主程序在调用专有动态库时,如何对专有动态库的导出函数的地址进行重定向。当专有动态库调用目标机器的原生公共动态库时,需要对专有动态库的导入函数的地址进行重定向。下面结合图5至图7,对导入函数的地址的重定向方式以及重定向之后的调用流程进行详细地举例说明。
85.参见图7,在步骤s710,对专有动态库的导入函数的地址进行重定向,使得导入函数的地址指向指令片段的地址。该指令片段在进行abi转换后可以指向目标机器的原生公共动态库。本技术实施例提及的指令片段可以指序幕指令序列,也可以指一个函数。作为一个示例,该指令片段可以为导入函数的包装函数。
86.仍然以上文提到的图5和图6为例进行说明(图6的示例中,上文提到的指令片段为包装函数)。在图5中,如果专有动态库34希望调用公共动态库ⅲ36c中的函数i_1(arm64)和公共动态库ⅳ36d中的函数i_3(arm64),则需要通过导入函数表344中的导入函数i_1和导入函数i_3来进行调用。但是,专有动态库34是以模拟x86的方式执行的,因此无法直接调用函数i_1(arm64)和函数i_3(arm64)。
87.参见图6,翻译引擎动态库对专有动态库进行翻译之后,除了生成前文提到的翻译缓冲64以及导出函数的包装函数表62之外,还可以生成导入函数的包装函数表66。该包装函数表66中的包装函数可以与导入函数表344中的导入函数一一对应,导入函数表344中的
任意一个导入函数的地址可以指向包装函数66中的与其对应的包装函数。例如,导入函数i_1的地址从原来的直接指向公共动态库中的函数i_1(arm64)修改为指向包装函数i_w_1,导入函数i_3的地址从原来的直接指向公共动态库中的函数i_3(arm64)修改为指向包装函数i_w_3。包装函数i_w_1和i_w_3在进行abi转换后可以指向翻译缓冲中的函数i_1(arm64) 和i_3(arm64)。经过abi转换,专有动态库可以对基于arm64指令集架构的指令进行调用。
88.继续参见图7,在步骤s710之后,可以继续执行步骤s720至步骤s740。在步骤s720,响应于目标软件的专有动态库调用导入函数,利用导入函数的地址确定指令片段的地址。本技术实施例提及的指令片段可以指序幕指令序列,也可以指一个函数。作为一个示例,该指令片段可以为导入函数的包装函数。在步骤s730~s740,对指令片段进行abi转换,得到另一指令片段(基于第二指令集架构,并指向原生公共动态库);利用该另一指令片段调用目标机器的原生公共动态库。
89.结合前文的描述可知,本技术实施例对目标软件的专有动态库进行二进制翻译。专有动态库的翻译方式可以采用相关技术提供的动态或静态翻译方式。相关技术提供的翻译方式均是以基本块为粒度的翻译方式。下文给出本技术实施例提供的一种以函数为粒度的翻译方式。
90.具体而言,在对专有动态库进行翻译的过程中,首先可以按elf文件中text段的地址顺序提取该专有动态库中的每个函数的起始地址和大小。然后,可以生成一个跳转表。该跳转表可用于记录源机器中的每条指令对应的翻译指令的起始地址。接着,可以按函数地址从小到大开始对每个函数进行翻译。在翻译过程中,可以将源机器的一条指令翻译成目标机器的对等指令,然后将翻译后的指令的起始地址记录到跳转表中。在翻译某个函数(下称函数1)的过程中,如果函数1内部遇到直接跳转指令,则可以判断该直接跳转指令所调用的函数(下称函数2)的地址是否比函数1的地址小。如果函数2的地址比函数1的地址小,则表示函数2的翻译工作已经完成,可以从跳转表中找到函数2的翻译地址,从而对该直接跳转指令进行翻译。如果函数2的地址比函数1的地址大,则表示函数2的翻译工作还未进行,此时可以为该跳转指令预留一个位置,等翻译完函数2之后再对该位置进行填充。在翻译函数1的过程中,如果遇到间接跳转指令,则该间接跳转指令所指向的地址的取值可能暂时还无法确定。面对这种情况,可以将该间接跳转指令包装成一个函数,该函数的功能可以设计为根据后续加载过程中提供的加载信息对该间接调整指令进行动态处理。
91.本技术实施例对二进制翻译的时机不作具体限定,可以在目标软件运行前进行二进制翻译,也可以在目标软件运行过程中进行二进制翻译。例如,响应于目标软件的主程序调用目标软件的专有动态库,可以对该专有动态库进行二进制翻译,得到该专有动态库的翻译代码。然后,该主程序可以调用该专有动态库的翻译代码,以实现目标软件的业务功能。
92.在一些实施例中,在加载动态库时,可以先对动态库的类型进行识别,以确定是否需要对该动态库进行二进制翻译。动态库的类型的识别可以基于elf文件格式进行,例如,动态库的类型相关的信息可以记录在elf文件头的固定位置。此外,在一些实施例中,动态库的类型的识别可以由加载器进行。该加载器具有识别不同类型的elf文件格式的功能,不同于相关技术提供的加载器。在一些实施例中,由于该加载器可以加载不同类型的动态库,因此可以将该加载器称为混合加载器。下面对具体的加载过程进行举例说明。
93.例如,可以先加载目标软件的动态库。然后,在加载该目标软件的动态库之后,可以根据目标软件的动态库的elf文件,识别目标软件的动态库所基于的指令集架构。如果目标软件的动态库基于第一指令集架构(即目标软件的动态库与目标机器基于不同的指令集架构),则可以调用翻译引擎动态库对目标软件的动态库进行翻译和重定向,以定位目标软件的动态库的翻译代码。对目标软件的动态库的翻译代码的重定向过程与前文中的图4至图7描述的过程类似,即将目标软件的动态库的导入函数和导出函数重定向至导入函数和导出函数的指令片段,然后利用导入函数和导出函数的指令片段重定向至目标软件的动态库的翻译代码。当然,需要说明的是,如果翻译引擎动态库之前已经翻译过该动态库,则直接使用翻译缓冲中存储的翻译代码即可,无需重新翻译。
94.进一步地,如果目标软件的动态库基于第二指令集架构(即目标软件的动态库与目标机器基于相同的指令集架构),直接定位目标软件的动态库。例如,可以基于目标软件的动态库的导入函数和导出函数对该目标软件的动态库进行重定向(在这种情况下,直接利用导入函数和导出函数进行重定向即可,无需构造上文提到的指令片段)。
95.本技术实施例对目标软件的动态库的加载时机不作具体限定。目标软件的动态库可以在目标软件启动时加载,也可以在目标软件运行时加载。例如,在目标软件启动时,可以从目标软件的elf文件里找到该elf文件记录的待加载的动态库,并从该待加载的动态库的elf文件中找到该elf文件记录的待加载的动态库。然后,在目标软件启动时,可以依次对这些待加载的动态库进行加载。又如,在目标软件运行过程中,可以基于目标软件中的调用加载动态库的函数对其指定的动态库进行加载。
96.以源机器基于x86指令集架构,目标机器基于arm64指令集架构为例,在动态库加载时,加载器可以基于该动态库的elf文件格式识别待加载的动态库的类型。例如,如果该动态库的elf文件格式与源机器的elf文件格式相同,则该动态库为x86版的动态库,需要对该动态库进行二进制翻译;如果动态库的elf文件格式与目标机器的elf文件格式相同,则该动态库为arm64版的动态库,无需对该动态库进行二进制翻译。
97.在一些实施例中,在加载专有动态库之后,以及在对该专有动态库进行二进制翻译之前,可以先识别是否存在该专有动态库的翻译代码(因为该动态库可能在之前已经进行过加载和翻译)。如果该专有动态库的翻译代码,则可以跳过翻译阶段直接调用该翻译代码。如果不存在该翻译代码,则可以对该专有动态库进行二进制翻译,并将翻译得到的翻译代码保存在缓冲文件中,供后续调用。
98.上文结合图1至图7,详细描述了本技术的方法实施例,下面结合图8和图9,详细描述本技术的装置实施例。应理解,方法实施例的描述与装置实施例的描述相互对应,因此,未详细描述的部分可以参见前面方法实施例。
99.图8是本技术实施例提供的一种运行软件的装置的结构示意图。图8的装置800可用于将目标软件从源机器移植至目标机器。所述源机器的处理器基于第一指令集架构,所述目标机器的处理器基于第二指令集架构,所述第一指令集架构与所述第二指令集架构不同。装置800可以包括加载模块810和第一调用模块820。加载模块810可用于在所述目标机器上加载所述目标软件的主程序。第一调用模块820可用于响应于所述主程序调用所述目标软件的专有动态库,调用所述专有动态库的翻译代码;其中,所述目标软件的主程序基于所述第二指令集架构,所述专有动态库基于所述第一指令集架构。
100.在一些实施例中,装置800还可包括:第二调用模块,用于响应于所述专有动态库调用所述目标软件的公共动态库,调用所述目标机器的原生公共动态库。
101.在一些实施例中,装置800还可包括:第一重定向模块,用于对所述专有动态库的导入函数的地址进行重定向,使得所述导入函数的地址指向第一指令片段的地址;所述第二调用模块用于响应于所述专有动态库调用所述导入函数,利用所述导入函数的地址确定所述第一指令片段的地址;对所述第一指令片段进行abi转换,得到第二指令片段,所述第二指令片段指向所述目标机器的原生公共动态库;利用所述第二指令片段调用所述目标机器的原生公共动态库。
102.在一些实施例中,装置800还可包括:第三调用模块,用于响应于所述主程序调用所述目标软件的公共动态库,直接调用所述目标机器的原生公共动态库。
103.在一些实施例中,装置800还可包括:第二重定向模块,用于对所述专有动态库的导出函数的地址进行重定向,使得所述导出函数的地址指向第三指令片段的地址;所述第一调用模块820可用于响应于所述主程序调用所述导出函数,利用所述导出函数的地址确定所述第三指令片段的地址;对所述第三指令片段进行abi转换,得到第四指令片段,其中,所述第四指令片段指向所述翻译代码;利用所述第四指令片段调用所述翻译代码。
104.在一些实施例中,所述第一调用模块还用于响应于所述主程序调用所述目标软件的专有动态库,调用所述目标机器上的翻译引擎动态库;利用所述翻译引擎动态库对所述专有动态库进行翻译,得到所述专有动态库的翻译代码;调用所述专有动态库的翻译代码。
105.在一些实施例中,所述装置还包括:加载模块,用于加载所述目标软件的动态库;根据所述目标软件的动态库的elf文件,识别所述目标软件的动态库所基于的指令集架构;如果所述目标软件的动态库基于所述第一指令集架构,调用翻译引擎动态库对所述目标软件的动态库进行翻译和重定向,以定位所述目标软件的动态库的翻译代码;如果所述目标软件的动态库基于所述第二指令集架构,直接定位所述目标软件的动态库。
106.在一些实施例中,所述主程序为所述目标机器的原生语言虚拟机。
107.在一些实施例中,所述原生语言虚拟机为java虚拟机或.net虚拟机。
108.在一些实施例中,所述第一指令集架构与所述第二指令集架构中的一个为x86指令集架构,所述第一指令集架构与所述第二指令集架构中的另一个为arm指令集架构。
109.图9是本技术实施例的装置的示意性结构图。图9中的虚线表示该单元或模块为可选的。该装置900可用于实现上述方法实施例中描述的方法。装置900可以是计算机或任意类型的电子设备。
110.装置900可以包括一个或多个处理器910。该处理器910可支持装置900实现前文方法实施例所描述的方法。该处理器910可以是通用处理器或者专用处理器。例如,该处理器可以为中央处理单元(central processing unit,cpu)。或者,该处理器还可以是其他通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现成可编程门阵列(field programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
111.装置900还可以包括一个或多个存储器920。存储器920上存储有程序,该程序可以被处理器910执行,使得处理器910执行前文方法实施例所描述的方法。存储器920可以独立
于处理器910也可以集成在处理器910中。
112.装置900还可以包括收发器930。处理器910可以通过收发器930与其他设备进行通信。例如,处理器910可以通过收发器930与其他设备进行数据收发。
113.本技术实施例还提供一种机器可读存储介质,用于存储程序。该机器可读存储介质可应用于本技术实施例提供的终端设备或网络设备中,并且该程序使得计算机执行本技术各个实施例中的由终端设备或网络设备执行的方法。
114.本技术实施例还提供一种计算机程序产品。该计算机程序产品包括程序。该计算机程序产品可应用于本技术实施例提供的终端设备或网络设备中,并且该程序使得计算机执行本技术各个实施例中的由终端设备或网络设备执行的方法。
115.本技术实施例还提供一种计算机程序。该计算机程序可应用于本技术实施例提供的终端设备或网络设备中,并且该计算机程序使得计算机执行本技术各个实施例中的由终端设备或网络设备执行的方法。
116.在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其他任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本公开实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在机器可读存储介质中,或者从一个机器可读存储介质向另一个机器可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述机器可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如数字视频光盘(digital video disc,dvd))、或者半导体介质(例如固态硬盘(solid state disk,ssd))等。
117.本领域普通技术人员可以意识到,结合本公开实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本公开的范围。
118.在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
119.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目
的。
120.另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
121.以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以所述权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1