技术领域
本发明涉及软件开发技术领域,尤其是一种在相同CPU指令集设备间实现软件跨平台二进制兼容的装置和方法。
背景技术
如今,个人电脑上可运行多种多样的操作系统,比如主流的有Windows,macOS,Linux等。众所周知,即便使用相同的CPU处理器,运行在某个操作系统上的应用软件放到其他操作系统上去也是无法运行的。当软件开发者希望使自己的软件能在多个操作系统上运行时,就需要一些跨平台技术配合。目前普遍的方案和缺点有:
(1)使用一些跨平台语言来开发软件。使用该方案开发的软件在运行时需要进行大量的指令转换处理,会导致处理性能损失严重。所以该方案不适合对性能要求高的软件中大量使用。
(2)通过源代码为目标平台重新编译。当为了追求性能,采用更接近硬件指令的汇编或C/C++语言开发时,由于各家编译器没有严格统一的语法标准,源代码往往不能完全兼容,导致编译失败。所以该方案的移植成功率较低。
(3)可为每种操作系统编写专属源代码。该方案需要一批分别熟悉不同操作系统的开发人员共同开发同一个功能,导致开发成本和技术门槛都变高。而且不同的源代码就无法确保相同的执行结果,必须增强软件测试工作。所以该方案导致开发和测试工作量会成倍提高。
发明内容
本发明的目的就是解决现有技术中的问题,提出一种在相同CPU指令集设备间实现软件跨平台二进制兼容的装置和方法,能够将己为某一特定操作系统开发的可执行程序或动态链接库转换成在一种与操作系统无关的发布文件,从而可不修改软件源代码和重新编译,使该软件在安装有其他操作系统且配备相同CPU指令集的设备上运行,实现软件跨平台二进制兼容。
基于发明的一方面,提供了一种基于相同CPU指令集实现软件跨平台二进制兼容的装置,包括:
工作于开发机上的转换器和工作于目标设备的加载器。
其中,所述转换器,进一步为用于从可执行程序或动态链接库中提取出执行入口地址、导入信息、导出信息、内存地址重定向信息,以及全部二进制执行代码,并处理成发布文件。
其中,所述加载器,进一步为用于加载发布文件中的二进制可执行代码、并完成内存地址转换、外部导入库加载、外部导入函数映射和内部导出函数注册等工作,最后从执行入口地址处调用入口函数,完成软件启动。
其中,所述发布文件,进一步为用于软件产品发布的跨平台程序文件,在与软件源码编译时指定的目标平台兼容的设备间通用,与操作系统无关。
其中,所述目标设备,进一步为与软件源码开发编译时指定的目标指令集兼容的,并安装有Windows操作系统或Linux操作系统或macOS操作系统的设备。
基于发明的另一方面,提供了一种基于相同CPU指令集实现软件跨平台二进制兼容的方法,包括:
步骤1、使用转换器将可执行程序或动态链接库转换成发布文件;
步骤2、将加载器和发布文件一同发布到目标设备上;
步骤3、在目标设备上使用加载器调用发布文件,完成软件启动。
本发明的有益效果是:
1、降低跨平台开发门槛,软件开发者只需通过调用本发明提供的转换器即可将己在开发机上开发编译生成的可执行程序或动态连接库转换成发布文件,而无需修改源代码和重新编译。
2、支持高性能软件的开发,支持C/C++语言开发,提供最佳的执行性能,无需借助其他跨平台编程语言。
3、降低开发和测试成本,由于跨平台过程只需进行二进制拷贝,不涉及源码修改,无需重新编译,可以忽略大多数平台无关的测试用例,从而对于有跨平台需求的软件可以避免重复开发,提高开发效率,节省大量开发测试成本。
4、获得一致的使用体验,采用该技术开发的跨平台软件不需要针对不同操作系统重新设计、重新开发,所以在任何操作系统上使用都是一样的操作过程。
附图说明
图1为本发明原理示意图;
图2为本发明转换器工作流程图;
图3为本发明加载器工作流程图。
具体实施方式
下面结合附图对本发明作进一步描述:
如图1所示,是本发明原理示意图。
通过从可执行程序文件中剥离掉与操作系统相关的部分,制作成操作系统无关的发布文件;并用自制程序模拟目标操作系统原生的可执行程序加载过程,完成与目标操作系统相关部分工作,实现软件跨平台运行。
如图2所示,是本发明中转换器的处理流程。
步骤1、读入开发人员开发编译生成的可执行程序或动态链接库。
步骤2、根据Windows和Linux和macOS可执行文件的格式定义解析可执行程序或动态链接库中的执行入口地址、导入信息、导出信息、内存地址重定向信息,以及全部二进制可执行代码。
步骤3、将所述执行入口地址、导入信息、导出信息、内存地址重定向信息组织成xml格式保存为.mod文件,另将二进制可执行代码复制保存为.code文件。
在本发明的实施例中,.mod文件和.code文件即为所述发布文件。
进一步地,所述转换器可以根据开发机实际情况编写面向各种设备和操作系统的版本,即当开发机是Windows操作系统时即使用能在Windows上工作解析Windows可执行文件格式的转换器,Linux操作系统和macOS操作系统同理。
如图3所示,是本发明中加载器的处理流程。
步骤1、加载器读入.mod文件和.code文件。
步骤2、根据.mod文件中记录的信息进行内存地址转换、外部导入库加载、外部导入函数映射和内部导出函数注册等处理,完成适配目标设备上的运行环境。
步骤3、从执行入口地址处调用入口函数。
进一步地,所述加载器可以根据目标机实际情况编写面向各种设备和操作系统的版本,即当目标机是Windows操作系统时即使用适配于Windows操作系统的加载器,Linux操作系统和macOS操作系统同理。
配备了适当的转换器和加载器后,就可以按如下步骤实现软件跨平台运行:
步骤1、使用转换器将可执行程序或动态链接库转换成发布文件;
步骤2、将加载器和发布文件一同发布到目标设备上;
步骤3、在目标设备上使用加载器调用发布文件,完成软件启动。
需要说明的是,调用了某个操作系统专属API的程序由于在其他操作系统上没有与之对应的API,所以本发明要求使用第三方跨平台库充当适配层取代直接调用Windows操作系统API,或者也可以将与操作系统紧耦合的部分在设计时独立出来。在本发明的一些实施例中,使用Qt或wxWidgets取代MFC、使用OpenGL代替DirectX、用libevent取代SocketAPI等。
通过采用上述装置和方法,即可不修改软件源代码和重新编译,使该软件在安装有其他操作系统且配备相同CPU指令集的设备上运行,实现软件跨平台二进制兼容。
上述实施例是对本发明的说明,不是对本发明的限定,任何对本发明简单变换后的方案均属于本发明的保护范围。
机译: 提供灵活的处理器扩展,灵活的指令集扩展和隐式仿真的计算机,以实现向上的软件兼容性
机译: 控制指令集体系结构及其装置之间的二进制翻译的兼容级别的系统
机译: 控制指令集体系结构及其装置之间的二进制翻译的兼容级别的系统