CN114816417B - 一种交叉编译方法、装置、计算设备及存储介质 - Google Patents

一种交叉编译方法、装置、计算设备及存储介质 Download PDF

Info

Publication number
CN114816417B
CN114816417B CN202210405424.0A CN202210405424A CN114816417B CN 114816417 B CN114816417 B CN 114816417B CN 202210405424 A CN202210405424 A CN 202210405424A CN 114816417 B CN114816417 B CN 114816417B
Authority
CN
China
Prior art keywords
compiling
architecture
acceleration layer
environment
compilation
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
Application number
CN202210405424.0A
Other languages
English (en)
Other versions
CN114816417A (zh
Inventor
何阳轩
隋平礼
曾宏安
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Linx Technology Co ltd
Original Assignee
Beijing Linx Technology Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Linx Technology Co ltd filed Critical Beijing Linx Technology Co ltd
Priority to CN202210405424.0A priority Critical patent/CN114816417B/zh
Publication of CN114816417A publication Critical patent/CN114816417A/zh
Application granted granted Critical
Publication of CN114816417B publication Critical patent/CN114816417B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/76Adapting program code to run in a different environment; Porting

Abstract

本发明公开了一种交叉编译方法、装置、计算设备及存储介质,该方法包括:基于第一架构的加速层、第二架构的编译环境和转换程序生成编译环境容器;获取待编译的软件包源代码并安装编译依赖包;响应于编译环境容器中发起的对软件包源代码的编译指令,由转换程序判断编译指令中的调用命令在第一架构的加速层中是否存在;当调用命令在加速层中存在,则在加速层中运行调用命令,当调用命令在加速层中不存在,则在第二架构的编译环境中运行调用命令。该方法能够提供与目标环境一致的编译运行环境,提高交叉编译的效率。

Description

一种交叉编译方法、装置、计算设备及存储介质
技术领域
本发明涉及计算机技术领域,具体涉及一种交叉编译方法、装置、计算设备及存储介质。
背景技术
基于ARM、RISC-V、PPC等非x86架构的精简指令集的嵌入式设备性能受限,往往不能通过本机编译得到所需软件的可执行程序。因此,以Linux为主机操作系统,搭配一个交叉编译系统,为嵌入式设备生成可执行程序已成为日益流行的编译嵌入式软件的解决方案。
交叉编译是在一个平台上生成另一个平台上的可执行代码。常见的交叉编译方案,需要在主机平台上安装对应的交叉编译工具链,然后用这个交叉编译工具链编译源代码,最终生成可在目标平台上运行的代码。但是由于每个发行版软件的包管理、软件版本及补丁均不相同,这种交叉编译方案对于系统发行版软件包构建并不适合,且常规的交叉编译方案对这种复杂环境的编译效率低,无法满足用户对编译效率的要求。
因此,需要一个能适用于复杂环境的交叉编译方案,以解决以上现有技术中存在的问题。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的一种交叉编译方法、装置、计算设备以及存储介质。
根据本发明的一个方面,提供一种交叉编译方法,在该方法中,首先基于第一架构的加速层、第二架构的编译环境和转换程序生成编译环境容器,这样可以使编译环境与目标运行环境基本一致。然后获取待编译的软件包源代码并安装软件包的编译依赖包。在生成的编译容器内发起对软件包源代码的编译指令,由转换程序判断编译指令中的调用命令在第一架构的加速层中是否存在。当调用命令在加速层中存在,则在加速层中运行调用命令,当调用命令在加速层中不存在,则在第二架构编译环境中运行调用命令。这样可以使编译指令优先匹配加速层中的二进制进行加速,可以提高交叉编译的效率。
可选地,在根据本发明的方法中,可以首先生成第一架构的加速层和第二架构的编译环境;然后根据第一架构的加速层和第二架构的编译环境编译相应的转换程序。接着将第二架构的编译环境作为基础镜像,该基础镜像、加速层及转换程序结合生成编译环境容器。这样可以实现不同编译环境之间的隔离。
可选地,在根据本发明的方法中,为了生成第一架构的加速层,可以在第一架构平台上安装交叉编译工具链和编译工具。将交叉编译工具链和编译工具提取到加速层二进制文件夹,将交叉编译工具链依赖的动态库和编译工具依赖的动态库提取到加速层库文件夹;以及将加速层内二进制依赖的库地址更改为加速层库地址。
可选地,在根据本发明的方法中,编译工具包括对第二架构进行预处理、编译、汇编和链接的工具。
可选地,在根据本发明的方法中,通过设置环境变量,使编译环境容器的搜索路径优先指向转换程序,以便转换程序通过判断编译指令中的调用命令是否由加速层提供。
可选地,在根据本发明的方法中,第一架构为Linux系统的x86、x86_64、x64架构中任意一种,第二架构为ARM、RISC-V、PPC架构中任意一种。
可选地,在根据本发明的方法中,通过调用加速层中的压缩工具,将编译好的二进制代码按照发行版格式打包成软件包。
根据本发明的另一个方面,提供一种交叉编译装置,该装置包括生成模块、获取模块、判断模块和运行模块。其中,生成模块可以基于第一架构的加速层、第二架构的编译环境和转换程序生成编译环境容器。获取模块可以获取待编译的软件包源代码并安装编译依赖包。判断模块可以响应于生成模块生成的编译环境容器中发起的对获取模块获取的软件包源代码的编译指令,判断编译指令中的调用命令在第一架构的加速层中是否存在。运行模块可以在判断模块判断调用命令在加速层中存在时,在加速层中运行调用命令,在判断模块判断调用命令在加速层中不存在时,在第二架构编译环境中运行调用命令。
根据本发明的又一个方面,提供一种计算设备,包括:至少一个处理器和存储有程序指令的存储器,其中,程序指令被配置为适于由至少一个处理器执行,程序指令包括用于执行上述方法的指令。
根据本发明的又一个方面,提供一种存储有程序指令的可读存储介质,当程序指令被计算设备读取并执行时,使得计算设备执行上述的方法。
根据本发明的方案,在主机上生成编译环境容器,使目标运行环境和本机运行环境基本一致,又能得到隔离的效果,当需要不同的编译工具时可以从相应的运行环境中调用,并且在调用时优先匹配主机加速层中的编译工具,可以对编译过程进行加速,从而提高交叉编译的效率。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了根据本发明一个实施例的计算设备100的结构图;
图2示出了根据本发明一个实施例的交叉编译方法200的流程示意图;
图3示出了根据本发明的一个实施例的生成编译环境容器的流程图;
图4示出了根据本发明的一个实施例的编译环境结构示意图;
图5示出了根据本发明一个实施例的交叉编译装置500的结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
编译就是将某种程序设计语言编译的程序翻译成二进制语言描述的可执行代码或程序。而交叉编译可以理解为在当前编译平台编译出的程序能运行在体系结构不同的另一种目标平台上。例如在X86平台上编译能在ARM平台运行的程序。之所以进行交叉编译,是由于目标平台的运行速度往往比主机慢,例如ARM等嵌入式系统被设计为低功耗和低成本,性能较低。而整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存。考虑到不同的体系架构有不同的机器特性,交叉编译时主机环境与目标环境不同,并且每个发行版软件的包管理、软件版本、补丁均不相同,因此需要提供一种与目标环境一致的主机环境,使交叉编译更加高效。
本方案在容器化编译环境内,通过判断目标架构的编译指令是否可由本机架构二进制替换,能够在保证编译环境与目标环境基本一致的前提下,高效率进行交叉编译。本方案提供了一种交叉编译方法,适于在计算设备中执行,其中计算设备中可以包括第一架构处理器。第一架构处理器可以直接运行第一架构的二进制,第一架构机器通过处理器模拟软件可以运行第二架构的二进制。图1示出了根据本发明一个实施例的计算设备100的结构图。需要说明的是,图1所示的计算设备100仅为一个示例,在实践中,用于实施本发明的网页管控方法的计算设备可以是任意型号的设备,其硬件配置情况可以与图1所示的计算设备100相同,也可以与图1所示的计算设备100不同。实践中用于实施本发明的网页管控方法的计算设备可以对图1所示的计算设备100的硬件组件进行增加或删减,本发明对计算设备的具体硬件配置情况不做限制。
如图1所示,在基本的配置102中,计算设备100典型地包括系统存储器106和一个或者多个处理器104。存储器总线108可以用于在处理器104和系统存储器106之间的通信。
取决于期望的配置,处理器104可以是任何类型的处理器,包括但不限于:微处理器(µP)、微控制器(µC)、数字信息处理器(DSP)或者它们的任何组合。处理器104可以包括诸如一级高速缓存110和二级高速缓存112之类的一个或者多个级别的高速缓存、处理器核心114和寄存器116。示例的处理器核心114可以包括运算逻辑单元(ALU)、浮点数单元(FPU)、数字信号处理核心(DSP核心)或者它们的任何组合。示例的存储器控制器118可以与处理器104一起使用,或者在一些实现中,存储器控制器118可以是处理器104的一个内部部分。
取决于期望的配置,系统存储器106可以是任意类型的存储器,包括但不限于:易失性存储器(诸如RAM)、非易失性存储器(诸如ROM、闪存等)或者它们的任何组合。计算设备中的物理内存通常指的是易失性存储器RAM,磁盘中的数据需要加载至物理内存中才能够被处理器104读取。系统存储器106可以包括操作系统120、一个或者多个应用122以及程序数据124。在一些实施方式中,应用122可以布置为在操作系统上由一个或多个处理器104利用程序数据124执行指令。操作系统120例如可以是Linux、Windows等,其包括用于处理基本系统服务以及执行依赖于硬件的任务的程序指令。应用122包括用于实现各种用户期望的功能的程序指令,应用122例如可以是浏览器、即时通讯软件、软件开发工具(例如集成开发环境IDE、编译器等)等,但不限于此。当应用122被安装到计算设备100中时,可以向操作系统120添加驱动模块。
在计算设备100启动运行时,处理器104会从存储器106中读取操作系统120的程序指令并执行。应用122运行在操作系统120之上,利用操作系统120以及底层硬件提供的接口来实现各种用户期望的功能。当用户启动应用122时,应用122会加载至存储器106中,处理器104从存储器106中读取并执行应用122的程序指令。
计算设备100还包括储存设备132,储存设备132包括可移除储存器136和不可移除储存器138,可移除储存器136和不可移除储存器138均与储存接口总线134连接。
计算设备100还可以包括有助于从各种接口设备(例如,输出设备142、外设接口144和通信设备146)到基本配置102经由总线/接口控制器130的通信的接口总线140。示例的输出设备142包括图形处理单元148和音频处理单元150。它们可以被配置为有助于经由一个或者多个A/V端口152与诸如显示器或者扬声器之类的各种外部设备进行通信。示例外设接口144可以包括串行接口控制器154和并行接口控制器156,它们可以被配置为有助于经由一个或者多个I/O端口158和诸如输入设备(例如,键盘、鼠标、笔、语音输入设备、触摸输入设备)或者其他外设(例如打印机、扫描仪等)之类的外部设备进行通信。示例的通信设备146可以包括网络控制器160,其可以被布置为便于经由一个或者多个通信端口164与一个或者多个其他计算设备162通过网络通信链路的通信。
网络通信链路可以是通信介质的一个示例。通信介质通常可以体现为在诸如载波或者其他传输机制之类的调制数据信号中的计算机可读指令、数据结构、程序模块,并且可以包括任何信息递送介质。“调制数据信号”可以这样的信号,它的数据集中的一个或者多个或者它的改变可以在信号中编码信息的方式进行。作为非限制性的示例,通信介质可以包括诸如有线网络或者专线网络之类的有线介质,以及诸如声音、射频(RF)、微波、红外(IR)或者其它无线介质在内的各种无线介质。这里使用的术语计算机可读介质可以包括存储介质和通信介质二者。
在根据本发明的计算设备100中,应用122包括用于执行本发明的交叉编译方法200的指令。
图2示出了根据本发明的一个实施例的交叉编译方法200的流程示意图。如图2所示,该方法200始于步骤S210,基于第一架构的加速层、第二架构的编译环境和转换程序生成编译环境容器。其中,第一架构可以是Linux系统的x86、x64、x86_64架构,或者是Windows系统架构等复杂指令集;第二架构可以是ARM架构、 RISC-V架构、PPC架构等精简指令集。为了进行高效的交叉编译,需要保证编译环境与目标运行环境一致,容器能够使开发、测试、部署环境都能很好的保持一致,相当于在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。图3示出了根据本发明的一个实施例的生成编译环境容器的流程图。如图3所示,首先要生成第一架构的加速层。具体地,可以在第一架构平台上安装交叉编译工具链和编译工具。然后,提取编译过程中所需的二进制及二进制依赖的库。具体地,可以使用相关工具将交叉编译工具链和编译工具提取到加速层二进制文件夹,将交叉编译工具链依赖的动态库和编译工具依赖的动态库提取到加速层库文件夹。编译过程包括预处理、编译、汇编、链接等功能,因此编译工具具体包括对第二架构(也就是目标架构)的预处理、编译、汇编、链接等工具。在本发明的一个实施例中,编译过程中要用到的工具包括awk(在文件或者字符串中基于指定规则浏览和抽取信息),sed(以行为单位进行文件处理),diffutils(比较两个文件),make(生成的可执行文件放在当前目录或某个子目录),tar(压缩命令),python,perl 等。其中,交叉编译工具链就是为了编译跨平台体系的程序而形成的由多个工具构成的一套完整的工具集,一般由编译器、连接器、解释器和调试器组成。可以直接下载已经编译好的交叉工具链,也可以分步编译和安装交叉编译工具链。也可以通过crosstool 项目生成交叉编译工具链。
在本发明的一个实施例中,可以分别创建加速层二进制文件夹 /accel/bin 及加速层库文件夹 /accel/lib , /accel/bin 用于存放第一架构的交叉编译工具链和其他编译配套工具。 /accel/lib可以存放交叉编译工具链和其他编译配套工具所依赖的动态库。
而使用的相关工具包括软件包加壳工具、软件包管理工具等,主要是编译配置过程中要用到的coreutils软件包,如 awk,sed,diffutils,grep,make,tar,xz 以及与包管理相关的python和 perl,其分别为 rpm 及 deb 的相关依赖。
为了避免库路径冲突,同时方便单独维护加速编译工具,将用于加速交叉编译的/accel 加速层与其它部分分离,所以不采用直接建立软链接的方式解决二进制寻找动态库的方式,而是将二进制代码依赖的库地址更改为加速层库地址,构建成第一架构的加速层运行环境。可以将二进制代码依赖的库地址更改为加速层库地址,生成第一架构的加速层编译环境。具体地,可以使用 patchelf将二进制中记录的 rpath 及 interpreter 值分别修改为 /accel/lib。 修改结束后可使用 readelf 进行确认。之后就可以使用壳程序生成第二架构的目标编译环境。壳程序是供用户和内核交互的程序,在本发明实施例中可以使用壳程序./gen-rootf.sh生成目标环境。
接着根据加速层和第二架构的编译环境确定相应的转换程序 convert2accel。该转换程序运行于用户空间,将第二架构的编译环境作为基础镜像,该基础镜像、加速层及转换程序结合生成编译环境容器。由于镜像是运行容器的前提,基础镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
图4示出了根据本发明的一个实施例的编译环境结构示意图。如图4所示,容器化编译环境包括运行于主机的加速层和通过处理器模拟软件在主机运行的目标架构(第二架构)的编译环境。加速层/accel中包含交叉编译工具链和编译过程中使用到的make、xz、coreutils等工具。加速层中的二进制与主机二进制架构(第一架构)相同。目标架构编译环境中包含所有构建过程中要用到的编译依赖及系统组件,提供无法通过加速层/accel进行加速的二进制、二进制的编译依赖和编译过程中要用到的库。将目标架构(第二架构)的编译环境作为基础镜像、与加速层及转换程序convert2accel结合生成编译环境容器。
接下来详细描述应用交叉编译方法编译一个软件包的具体过程。如图2所示,在生成编译环境容器后,执行步骤S220,获取待编译的软件包源代码并安装编译依赖包。举例来说,在使用 deb 作为包管理的系统中,获取源码及安装编译依赖包有多种选择,例如可以通过 git 获取源码:git clone GIT_URI。然后安装编译依赖mk-build-deps --install--remove debian/control。
随后执行步骤S230,响应于编译环境容器中发起的对软件包源代码的编译指令,由转换程序判断编译指令中的调用命令在第一架构的加速层中是否存在。例如,可以设置环境变量,使得发出指令后编译环境容器的搜索路径优先指向转换程序 convert2accel,由 convert2accel 对运行指令进行处理,优先匹配 /accel 加速层下的结果,convert2accel 程序通过对比要调用的命令在 /accel下是否提供。比如:将gccconftest.c替换为:/accel/usr/bin/gcc conftest.c。可使用环境变量 gcc -v conftest2>&1 | grep cc1 查看是否调用了 /accel 加速层下的编译工具,编译结果可以使用file 命令确认可执行文件是否为目标架构文件。
最后执行步骤S240,当调用命令在加速层中存在,则在加速层中运行调用命令,当调用命令在加速层中不存在,则在第二架构编译环境中运行调用命令。具体地,如果传入的指令类型为交叉编译工具连中的编译器相关,则指向 加速层/accel 下的交叉编译工具,并修改相应参数使得编译可以正常运行;如果传入指令为其它编译工具相关,比如调用 xz进行压缩文件,调用 /accel/bin/xz 进行解压。其中当调用/accel 加速层的二进制时,由于可执行文件架构与主机同架构,所以可以高效率运行。当 /accel 加速层下未提供相关二进制时,则直接使用 arm64 编译容器内的二进制,同时实际编译过程中使用的静态库及动态库均由 arm64 容器提供。
在本发明的一个实施例中,调用命令 make 在 /accel 中存在,则在调用时会运行 /accel/bin/make,编译过程中的预处理、编译、汇编、链接阶段均会调用 /accel 加速层下的交叉编译工具链。其它指令比如 deb 构建过程中大量使用了 perl 脚本,这时perl也会被替换为 /accel 加速层下的二进制及相关模块。而配置阶段在壳程序中执行configure 时,调用的二进制 bash 由 arm64 容器提供,此阶段没有加速。
在完成上述交叉编译后,可以调用加速层中的压缩工具xz,将编译好的二进制按照发行版格式打包成编译后的软件包。此时为xz为第一架构二进制,可高效率运行。
图5示出了根据本发明一个实施例的交叉编译装置500的结构示意图。如图5所示,交叉编译装置包括生成模块510、获取模块520、判断模块530和运行模块540。其中生成模块510可以基于第一架构的加速层、第二架构的编译环境和转换程序生成编译环境容器。获取模块520可以获取待编译的软件包源代码并安装编译依赖包。判断模块530可以响应于生成模块510生成的编译环境容器中发起的对获取模块520获取的软件包源代码的编译指令,由转换程序判断编译指令中的调用命令在第一架构的加速层中是否存在。运行模块540可以在判断模块530判断调用命令在加速层中存在时,在加速层中运行调用命令,在判断模块530判断调用命令在加速层中不存在时,在第二架构编译环境中运行调用命令。
通过上述方案,在主机上生成编译环境容器,使目标运行环境和本机运行环境基本一致,当需要不同的编译工具时可以从相应的运行环境中调用,并且在调用时优先匹配主机加速层中的编译工具,可以对编译过程进行加速,从而提高交叉编译的效率。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员应当理解在本文所公开的示例中的设备的模块或单元或组件可以布置在如该实施例中所描述的设备中,或者可替换地可以定位在与该示例中的设备不同的一个或多个设备中。前述示例中的模块可以组合为一个模块或者此外可以分成多个子模块。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
此外,所述实施例中的一些在此被描述成可以由计算机系统的处理器或者由执行所述功能的其它装置实施的方法或方法元素的组合。因此,具有用于实施所述方法或方法元素的必要指令的处理器形成用于实施该方法或方法元素的装置。此外,装置实施例的在此所述的元素是如下装置的例子:该装置用于实施由为了实施该发明的目的的元素所执行的功能。
如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其它方式的给定顺序。
尽管根据有限数量的实施例描述了本发明,但是受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其它实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,在不偏离所附权利要求书的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的而非限制性的,本发明的范围由所附权利要求书限定。

Claims (10)

1.一种交叉编译方法,适于在计算设备中执行,其特征在于,所述方法包括:
基于第一架构的加速层、第二架构的编译环境和转换程序生成编译环境容器;
获取待编译的软件包源代码并安装编译依赖包;
响应于所述编译环境容器中发起的对所述软件包源代码的编译指令,所述转换程序判断所述编译指令中的调用命令在第一架构的加速层中是否存在;
当所述调用命令在所述加速层中存在,则在所述加速层中运行所述调用命令,当所述调用命令在加速层中不存在,则在所述第二架构的编译环境中运行所述调用命令。
2.根据权利要求1所述的方法,其特征在于,所述基于第一架构的加速层、第二架构的编译环境和转换程序生成编译环境容器的方法包括:
生成第一架构的加速层和第二架构的编译环境;
根据第一架构的加速层和第二架构的编译环境编译相应的转换程序;
将所述第二架构的编译环境作为基础镜像,所述基础镜像、加速层及转换程序结合生成编译环境容器。
3.根据权利要求1所述的方法,其特征在于,所述第一架构的加速层的步骤包括:
在第一架构平台上安装交叉编译工具链和编译工具;
将所述交叉编译工具链和编译工具提取到加速层二进制文件夹,将所述交叉编译工具链依赖的动态库和所述编译工具依赖的动态库提取到加速层库文件夹;以及
将加速层内二进制依赖的库地址更改为加速层库地址,生成第一架构的加速层。
4.根据权利要求3所述的方法,其特征在于,所述编译工具包括对第二架构进行预处理、编译、汇编和链接的工具。
5.根据权利要求1所述的方法,其特征在于,所述响应于对所述软件包源代码的编译指令,判断所述编译指令中的调用命令在第一架构的加速层中是否存在的步骤包括:
设置环境变量,使编译环境容器的搜索路径优先指向所述转换程序,以便所述转换程序通过判断编译指令中的调用命令是否由加速层提供。
6.根据权利要求1 所述的方法,其特征在于,所述第一架构为Linux系统的x86、x86_64、x64架构中任意一种,所述第二架构为ARM、RISC-V、PPC架构中任意一种。
7.根据权利要求1所述的方法,其特征在于,所述方法还包括:
调用加速层中的压缩工具,将编译好的二进制代码按照发行版格式打包成编译后的软件包。
8.一种交叉编译装置,其特征在于,所述装置包括:
生成模块,适于基于第一架构的加速层、第二架构的编译环境和转换程序生成编译环境容器;
获取模块,适于获取待编译的软件包源代码并安装编译依赖包;
判断模块,适于响应于所述生成模块生成的编译环境容器中发起的对所述获取模块获取的软件包源代码的编译指令,判断所述编译指令中的调用命令在第一架构的加速层中是否存在;
运行模块,适于在所述判断模块判断调用命令在所述加速层中存在时,在所述加速层中运行所述调用命令,在所述判断模块判断所述调用命令在加速层中不存在时,在所述第二架构的编译环境中运行所述调用命令。
9.一种计算设备,包括:
至少一个处理器;和
存储有程序指令的存储器,其中,所述程序指令被配置为适于由所述至少一个处理器执行,所述程序指令包括用于执行如权利要求1-7中任一项所述方法的指令。
10.一种存储有程序指令的可读存储介质,当所述程序指令被计算设备读取并执行时,使得所述计算设备执行如权利要求1-7中任一项所述的方法。
CN202210405424.0A 2022-04-18 2022-04-18 一种交叉编译方法、装置、计算设备及存储介质 Active CN114816417B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210405424.0A CN114816417B (zh) 2022-04-18 2022-04-18 一种交叉编译方法、装置、计算设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210405424.0A CN114816417B (zh) 2022-04-18 2022-04-18 一种交叉编译方法、装置、计算设备及存储介质

Publications (2)

Publication Number Publication Date
CN114816417A CN114816417A (zh) 2022-07-29
CN114816417B true CN114816417B (zh) 2022-10-11

Family

ID=82535922

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210405424.0A Active CN114816417B (zh) 2022-04-18 2022-04-18 一种交叉编译方法、装置、计算设备及存储介质

Country Status (1)

Country Link
CN (1) CN114816417B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024036517A1 (zh) * 2022-08-17 2024-02-22 芯原微电子(上海)股份有限公司 一种交叉链接方法、装置,电子设备及存储介质
CN116243971B (zh) * 2023-05-10 2023-07-28 北京麟卓信息科技有限公司 一种基于静态依赖自举的内核无关的模块构建方法
CN116991381B (zh) * 2023-09-26 2023-12-29 统信软件技术有限公司 一种应用交叉编译方法、装置、计算设备及存储介质
CN116991427B (zh) * 2023-09-26 2023-12-29 统信软件技术有限公司 一种应用编译方法、装置、计算设备及存储介质

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8516459B2 (en) * 2008-03-25 2013-08-20 Intel Corporation XSLT-specific XJIT compiler
CN103092618A (zh) * 2013-01-15 2013-05-08 东南大学 基于软件Cache的Dalvik虚拟机JIT加速方法
CN107077377B (zh) * 2016-12-29 2020-08-04 深圳前海达闼云端智能科技有限公司 一种设备虚拟化方法、装置、系统及电子设备、计算机程序产品
US20210049465A1 (en) * 2019-08-12 2021-02-18 University Of Southern California Self-optimizing and self-programming computing systems: a combined compiler, complex networks, and machine learning approach
CN111966397A (zh) * 2020-07-22 2020-11-20 哈尔滨工业大学 一种异构并行程序自动移植和优化方法

Also Published As

Publication number Publication date
CN114816417A (zh) 2022-07-29

Similar Documents

Publication Publication Date Title
CN114816417B (zh) 一种交叉编译方法、装置、计算设备及存储介质
US9811360B2 (en) Dynamic determination of application server runtime classloading
KR102059705B1 (ko) 적응식 이식가능 라이브러리
US7987458B2 (en) Method and system for firmware image size reduction
US7340730B2 (en) On demand, network accessible, run time compile server
EP1313011B1 (en) Intermediate code execution system, intermediate code execution method, and computer program product for executing intermediate code
EP0905617A2 (en) Method for generating a java bytecode data flow graph
US8001518B2 (en) Configuring a shared library to accommodate relocatable data in a pervasive device
JP2000035893A (ja) デ―タ処理システムの配列の静的初期化方法、デ―タ処理方法、並びにデ―タ処理システム及びその制御手順をコンピュ―タに実行させるプログラムを記憶したコンピュ―タ読み取り可能な記憶媒体
KR20040004551A (ko) 사전 습득된 프로그램 파일들을 생성 및 이용하기 위한방법 및 디바이스
JP2000347871A (ja) スタブ/アダプタ自動生成器
US7124407B1 (en) Method and apparatus for caching native code in a virtual machine interpreter
CN113127100B (zh) 一种异构程序执行方法、装置、计算设备及可读存储介质
US20040083467A1 (en) System and method for executing intermediate code
CN114116134A (zh) 智能合约部署和执行方法、设备及存储介质
CN115629971A (zh) 一种应用的开发系统和开发方法
US7051323B2 (en) Method and apparatus for initializing romized system classes at virtual machine build time
US9135027B1 (en) Code generation and execution for dynamic programming languages
CN113220327B (zh) 智能合约升级方法及区块链系统
CN114780173A (zh) 一种在应用中加载插件的方法、计算设备及存储介质
KR100478463B1 (ko) 응용 프로그램의 동적링크 방법
CN117093227B (zh) 一种用于执行智能合约的方法及装置
CN115794260B (zh) 一种简单的dsp软件库动态加载方法
KR101213651B1 (ko) 운영체제의 초기화 스크립트의 이진화 방법, 및 그 이진화 스크립트의 실행 방법
WO2022179338A1 (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