CN115543332A - 编译时提前链接的方法 - Google Patents
编译时提前链接的方法 Download PDFInfo
- Publication number
- CN115543332A CN115543332A CN202110745174.0A CN202110745174A CN115543332A CN 115543332 A CN115543332 A CN 115543332A CN 202110745174 A CN202110745174 A CN 202110745174A CN 115543332 A CN115543332 A CN 115543332A
- Authority
- CN
- China
- Prior art keywords
- file
- electronic device
- program
- relocation
- advance
- 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.)
- Pending
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
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请提供了编译时提前链接的方法以及电子设备。本申请实施例提供的编译时提前链接的方法包括:首先,在提前编译时,通过导出符号表或者过程链接表完成外部符号的重定位,以及通过PC相关寻址完成内部符号的重定位,进而不需要在提前编译输出的文件中保留重定位信息,降低了提前编译输出文件的体积;其次,在提前编译时,可以通过导出符号表获取外部符号的物理地址,使得提前编译输出的文件可以保存在ROM/flashmemory中,进而降低了提前编译输出的文件对RAM的占用,使得提前编译输出的文件可以就地执行。
Description
技术领域
本申请涉及电子技术领域,尤其涉及编译时提前链接的方法及电子设备。
背景技术
嵌入式微控制单元(microcontrollerunit,MCU)因其硬件功耗低、成本低、体积小等优点,被广泛的应用在物联网(internetofthings,IOT)领域的电子设备上。例如,智能穿戴设备、智能家居设备等智能设备中都配置有嵌入式MCU。
开源的WebAssembl引擎wasm-micro-runtime(WAMR)可被移植到Cortex-M4等嵌入式处理器及NuttX、LiteOS等嵌入式OS上。通过安全沙箱的执行机制将应用和操作系统进行安全隔离,可以解决嵌入式系统上构建开放性软件生态的问题。
受限于嵌入式MCU的成本、体积等因素,相比于传统芯片,嵌入式MCU的计算资源和存储资源较为有限,难以支撑即时编译(justintime,JIT)执行的计算开销,所以嵌入式MCU上的运行的第三方目标程序需要提前编译(ahead of time compilation,AOT)以提升目标程序的加载、运行速度。
其中,提前编译为在目标程序运行前,将目标程序的代码转变为机器码。电子设备在加载、运行第三方目标程序时,可以直接根据代码对应的物理地址读取目标程序运行所需的变量、函数等。
提前编译生成的目标文件中包含重定位信息,目标文件的体积较大,读入内存时,内存开销较大。其次,在运行时需要对AOT文件进行重定位,降低了目标程序的加载、运行速度。
发明内容
本申请实施例提供了一种编译时提前链接的方法即电子设备,能够在提前编译时完成应用程序的内部符号和外部符号的重定位,编译后的得到的文件为可以就地执行的文件。本申请实施例提供的一种编译时提前链接的方法,可以提高了应用程序的启动速度,并且可以降低运行应用程序时的内存开销。
第一方面,本申请提供了一种编译时提前链接的方法,该方法包括:电子设备获取第一文件,该第一文件包括第一应用程序的WASM字节码文件;该电子设备提前编译该第一文件得到第一可就地执行文件;该电子设备在该提前编译该第一文件时进行第一程序的内部符号的重定位;该电子设备在该提前编译该第一文件时根据第一导出符号表进行第一程序的外部符号的重定位,该第一导出符号表包括该电子设备上系统函数和系统变量对应的符号的物理地址。该电子设备就地执行(XIP)该第一可就地执行文件。
在上述实施例中,电子设备可以在提前编译时,完成应用程序内部符号和外部符号的重定位,提前编译后得到的文件可以被电子设备支持就地执行,进而提高了目标程序的启动速度,并且由于就地执行不需要将程序加载到内存中,降低了电子设备内存的开销。
结合第一方面的一些实施例,在一些实施例中,电子设备获取第二文件,该第二文件包括第二应用程序的WASM字节码文件;该电子设备提前编译该第二文件得到第二可就地执行文件;该电子设备在该提前编译该第二文件时进行第二程序的内部符号的重定位;该电子设备在该提前编译该第二文件时根据第一导出符号表进行第二程序的外部符号的重定位,该第一导出符号表包括该电子设备上系统函数和系统变量对应的符号的物理地址;该电子设备就地执行该第二可就地执行文件。
在上述实施例中,电子设备上不同的应用程序可以根据同一个导出符号表完成外部符号的重定位,该不同的应用程序可以是不同类型的应用。即,电子设备在提前编译时可以生产一个公用的导出符号表,完成多个应用程序的外部符号的重定位。
结合第一方面的一些实施例,在一些实施例中,该电子设备上系统函数和系统变量对应的符号的物理地址是对该第一应用程序开放的系统函数和系统变量;该电子设备在提前编译该第一文件前,还包括:该电子设备基于该第一应用程序的应用程序包名或应用程序ID或应用程序类型确定第一导出符号表。
在上述实施例中,电子设备还可以根据应用程序的标识信息如包名、ID、应用类型确定向该应用程序开放哪些、或者哪些类型的系统函数和系统变量,进而实现对不同应用程序的差异化的权限分配。例如,对于驱动程序,可以开放所有的系统函数和系统变量;对于应用程序,可以开放部分系统函数和系统变量。
结合第一方面的一些实施例,在一些实施例中,该电子设备在该提前编译该第一文件时确定该第一程序的外部符号与该第一导出符号表的表项之间的映射关系;该电子设备根据该映射关系进行第一程序的外部符号的重定位。
在上述实施例中,电子设备在提前编译应用程序时,需要确定每一个外部符号的物理地址在导出符号表中的位置,然后根据位置寻找到该外部符号的物理地址,进而完成外部符号的重定位。
结合第一方面的一些实施例,在一些实施例中,该电子设备在该提前编译该第一文件前,还包括:该电子设备确定该第一导出符号表的基址。
在上述实施例中,电子设备在提前编译应用程序时,可以将导出符号表的基址传递给编译器,编译器在提前编译时通过基址获取导出符号表。
结合第一方面的一些实施例,在一些实施例中,该电子设备在该提前编译该第一文件前,还包括:该电子设备将该第一导出符号表存储在本地的寄存器中。
在上述实施例中,电子设备在提前编译应用程序时,可以将导出符号表保存在本地的寄存器中,编译器可以从本地寄存器中获取该导出符号表。
结合第一方面的一些实施例,在一些实施例中,该电子设备在该提前编译该第一文件前,还包括:该电子设备将该导出符号表保存为配置文件。
在上述实施例中,电子设备在提前编译应用程序时,可以将导出符号表保存为配置文件并保存在存储介质中,编译器读取该配置文件进而获取该导出符号表。
结合第一方面的一些实施例,在一些实施例中,该电子设备在该提前编译该第一文件前,还包括:该电子设备在运行时Runtime中的结构体中增加第一参数,该第一参数用于向编译器传递该第一导出符号表。
在上述实施例中,电子设备在可以通过运行时的参数将导出符号表或导出符号表的基址传递给编译器,编译器在编译应用程序时,可以获取到该导出符号表。
结合第一方面的一些实施例,在一些实施例中,该结构体包括WASMExecEnv。
结合第一方面的一些实施例,在一些实施例中,该运行时Runtime包括WebAssembly Micro Runtime。
结合第一方面的一些实施例,在一些实施例中,该电子设备将该第一可就地执行文件的代码段保存到ROM/flash memory中。
在上述实施例中,电子设备提前编译应用程序后的文件为位置无关的文件,可以保存在只读存储介质中就地执行,而不用加载到内存中,降低了内存开销。
第二方面,本申请提供了另一种编译时提前链接的方法,该方法包括:
电子设备获取第一文件,该第一文件包括第一应用程序的WASM字节码文件;该电子设备提前编译该第一文件得到第一可执行文件;该电子设备在该提前编译该第一文件时进行第一程序的内部符号的重定位;该电子设备在该提前编译该第一文件时根据过程链接表进行第一程序的外部符号的重定位,该过程链接表为电子设备运行该第一可执行文件时为第一可执行文件分配的,该过程链接表包括该电子设备上系统函数和系统变量对应的符号的物理地址。
在上述实施例中,由于过程链接表的表项保存有外部符号的物理地址,电子设备提前编译生成的文件中不包括重定位信息,降低了运行时需要被载入内存的文件的大小。
结合第一方面的一些实施例,在一些实施例中,该电子设备在该提前编译该第一文件时根据过程链接表进行第一程序的外部符号的重定位,具体包括:该电子设备在提前编译第一文件时确定第一程序的外部符号与过程链接表中表项的映射关系;该电子设备基于该映射关系进行第一程序的外部符号的重定位。
在上述实施例中,电子设备确定第一程序的外部符号和PLT表项之间的映射关系,进而可以在运行应用程序时可以确定外部符号的物理地址。
第三方面,本申请提供了一种电子设备,该电子设备包括:一个或多个处理器和存储器;该存储器与该一个或多个处理器耦合,该存储器用于存储计算机程序代码,该计算机程序代码包括计算机指令,该一个或多个处理器调用该计算机指令以使得该电子设备执行:获取第一文件,该第一文件包括第一应用程序的WASM字节码文件;提前编译该第一文件得到第一可就地执行文件;在该提前编译该第一文件时进行第一程序的内部符号的重定位;在该提前编译该第一文件时根据第一导出符号表进行第一程序的外部符号的重定位,该第一导出符号表包括上系统函数和系统变量对应的符号的物理地址。就地执行(XIP)该第一可就地执行文件。
在上述实施例中,电子设备可以在提前编译时,完成应用程序内部符号和外部符号的重定位,提前编译后得到的文件可以被电子设备支持就地执行,进而提高了目标程序的启动速度,并且由于就地执行不需要将程序加载到内存中,降低了电子设备内存的开销。
结合第三方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:获取第二文件,该第二文件包括第二应用程序的WASM字节码文件;提前编译该第二文件得到第二可就地执行文件;在该提前编译该第二文件时进行第二程序的内部符号的重定位;在该提前编译该第二文件时根据第一导出符号表进行第二程序的外部符号的重定位,该第一导出符号表包括该电子设备上系统函数和系统变量对应的符号的物理地址;就地执行该第二可就地执行文件。
结合第三方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:该电子设备上系统函数和系统变量对应的符号的物理地址是对该第一应用程序开放的系统函数和系统变量;在提前编译该第一文件前,基于该第一应用程序的应用程序包名或应用程序ID或应用程序类型确定第一导出符号表。
结合第三方面的一些实施例,在一些实施例中,该一个或多个处理器,具体用于调用该计算机指令以使得该电子设备执行:在该提前编译该第一文件时确定该第一程序的外部符号与该第一导出符号表的表项之间的映射关系;根据该映射关系进行第一程序的外部符号的重定位。
结合第三方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:确定该第一导出符号表的基址。
结合第三方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:将该第一导出符号表存储在本地的寄存器中
结合第三方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:将该导出符号表保存为配置文件。
结合第三方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:在运行时Runtime中的结构体中增加第一参数,该第一参数用于向编译器传递该第一导出符号表。
结合第三方面的一些实施例,在一些实施例中,该结构体包括WASMExecEnv。
结合第三方面的一些实施例,在一些实施例中,该运行时Runtime包括WebAssembly Micro Runtime。
结合第三方面的一些实施例,在一些实施例中,该一个或多个处理器,还用于调用该计算机指令以使得该电子设备执行:将该第一可就地执行文件的代码段保存到ROM/flash memory中。
第四方面,本申请提供了一种电子设备,该电子设备包括:一个或多个处理器和存储器;该存储器与该一个或多个处理器耦合,该存储器用于存储计算机程序代码,该计算机程序代码包括计算机指令,该一个或多个处理器调用该计算机指令以使得该电子设备执行:获取第一文件,该第一文件包括第一应用程序的WASM字节码文件;提前编译该第一文件得到第一可执行文件;在该提前编译该第一文件时进行第一程序的内部符号的重定位;在该提前编译该第一文件时根据过程链接表进行第一程序的外部符号的重定位,该过程链接表为电子设备运行该第一可执行文件时为第一可执行文件分配的,该过程链接表包括该电子设备上系统函数和系统变量对应的符号的物理地址。
结合第四方面的一些实施例,在一些实施例中,一个或多个处理器,具体用于调用该计算机指令以使得该电子设备执行:在提前编译第一文件时确定第一程序的外部符号与过程链接表中表项的映射关系;基于该映射关系进行第一程序的外部符号的重定位。
第五方面,本申请实施例提供了一种芯片系统,该芯片系统应用于电子设备,该芯片系统包括一个或多个处理器,该处理器用于调用计算机指令以使得该电子设备执行如第一方面、第二方面以及第一方面、第二方面中任一可能的实现方式描述的方法。
第六方面,本申请实施例提供一种包含指令的计算机程序产品,当上述计算机程序产品在电子设备上运行时,使得该电子设备执行如第一方面、第二方面以及第一方面、第二方面中任一可能的实现方式描述的方法。
第七方面,本申请实施例提供一种计算机可读存储介质,包括指令,当上述指令在电子设备上运行时,使得该电子设备执行如第一方面、第二方面以及第一方面、第二方面中任一可能的实现方式描述的方法。
可以理解地,上述第三方面和第四方面提供的电子设备、第五方面提供的芯片系统、第六方面提供的计算机程序产品以及第七方面提供的计算机存储介质均用于执行本申请实施例所提供的方法。因此,其所能达到的有益效果可参考对应方法中的有益效果,此处不再赘述。
附图说明
图1为本申请涉及的程序处理过程的一个示例性示意图;
图2为本申请涉及的编译器工作原理的一个示例性示意图;
图3为本申请涉及的地址转换的一个示例性示意图;
图4为本申请涉及的XIP运行与非XIP运行的一个示例性示意图;
图5A为本申请涉及的WAMR中提前编译的一个示例性示意图;
图5B为本申请涉及的目标文件的链接时重定位的一个示例性示意图;
图6A为本申请涉及的PC相关寻址的一个示例性示意图;
图6B为本申请涉及的GOT表寻址的一个示例性示意图;
图7为本申请涉及的一种目标程序PIC编译方法的示例性示意图;
图8为本申请实施例提供的实现编译时提前链接的方法后目标文件的一个示例性示意图;
图9为本申请实施例提供的编译时提前链接的方法的一个示例性示意图;
图10为本申请实施例提供的获取WASM字节码格式的目标程序的一个示例性示意图;
图11为本申请实施例提供的处理目标文件中的重定位组过程的一个示例性示意图;
图12A为本申请实施例提供的PC相关寻址的一个示例性示意图;
图12B、图12C本申请实施例提供的编译时提前链接输出的目标文件代码段的一个示例性示意图;
图13为本申请实施例提供的目标程序的运行方法的一个示例性示意图;
图14为本申请实施例提供的操作系统向编译器提供导出符号表的一个示例性示意图;
图15A、图15B、图15C为本申请实施例提供编译器获取导出符号表方法的一个示例性示意图;
图16为本申请实施例提供的目标程序实施编译时提前链接时权限动态分配的一个示例性示意图;
图17为本申请实施例提供的目标程序实施编译时提前连接以及XIP运行时静态权限分配的一个示例性示意图;
图18为本申请实施例提供的电子设备100硬件结构的一个示例性示意图;
图19为本申请实施例提供的电子设备100软件结构的一个示例性示意图。
具体实施方式
本申请以下实施例中所使用的术语只是为了描述特定实施例的目的,而并非旨在作为对本申请的限制。如在本申请的说明书和所附权利要求书中所使用的那样,单数表达形式“一个”、“一种”、“该”、“上述”、“该”和“这一”旨在也包括复数表达形式,除非其上下文中明确地有相反指示。还应当理解,本申请中使用的术语“和/或”是指并包含一个或多个所列出项目的任何或所有可能组合。
以下,术语“第一”、“第二”仅用于描述目的,而不能理解为暗示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征,在本申请实施例的描述中,除非另有说明,“多个”的含义是两个或两个以上。
首先,为了便于理解,下面先对本申请实施例涉及的相关术语及相关概念进行介绍。本发明的实施方式部分使用的术语仅用于对本发明的具体实施例进行解释,而非旨在限定本发明。
(1)CPU执行程序的过程
CPU可以识别并执行“0”、“1”(二进制)组成的机器码,但是不能直接执行由高级语言编写的目标程序。所以,由高级语言开发的目标程序在被CPU执行前,目标程序需要经过一系列处理,将目标程序的高级语言转换为机器码,如编译、汇编、链接等。CPU直接执行目标程序的机器码。其中,机器码为面向机器的代码,例如机器码“C706 0000 0002”(16进制)表示将数据2放到内存地址为0000的地方。
下面以图1所示的内容为例,以一个C语言编写的目标程序为例,示例性的介绍目标程序的处理过程。
图1为本申请涉及的程序处理过程的一个示例性示意图。
如图1所示,一个由C语言开发的目标程序,可以经过预处理、编译、汇编、链接后,生成机器码格式的可执行文件,进而被CPU执行。
例如,若目标程序为hello.c,经过预处理生成hello.i;进一步的,hello.i会被编译器编译为hello.s;再进一步的,hello.s会被汇编编译器编译为hello.o,hello.o的语言形式为机器码。虽然hello.o中的代码均为机器码,但是hello.o并不是可以执行的文件,还需要经过链接以进行重定位;hello.o被链接生成可执行文件。其中,链接可以是将多个.o格式的文件合并,进行重定位,生成可执行文件。
其中,重定位用于确定运行时每个符号的地址,即在运行时,将符号引用处的地址刷新为符号定义的地址。其中,符号可以包括:函数(函数名)、变量。
例如,main.c程序其中调用了静态库mylib.a中的函数myfunc1。在编译main.c时,编译器不能确定函数myfunc1的地址,编译器会将一个“临时地址”放到可重定位目标文件main.o的call指令中。在链接阶段,这个“临时地址”会被修正为正确的引用地址。这个过程可以称为重定位。其中,myfunc1为本申请实施例中的符号。
值得说明的是,不是目标程序源代码中所有的函数和变量都是符号,例如非静态局部变量(auto变量)等。本申请实施例中,为了方便描述,符号指代需要被重定位的函数(函数名)、变量。
本申请实施例提供的编译时提前链接的方法,可以在编译时完成全部或部分的重定位。
其中,编译的过程、编译器、机器码、静态链接、动态链接等概念可以参考术语解释中(2)编译器、(3)解释执行、提前编译(ahead of time compilation,AOT)、即时编译、(5)静态链接、动态链接、延迟链接的文字描述,此处不再赘述。
值得说明的是,并不是所有的高级语言编写的程序都需要经过编译、汇编、链接的过程才能转换为机器码格式。
(2)编译器
编译器是将一种语言转换为另一种语言的功能模块。其中,大部分编译器为将目标程序源代码翻译成机器码的功能模块。编译器负责执行程序处理过程中编译步骤的功能模块。
为了降低编译器的代码实现难度,以及提高编译器的可扩展性,在实现时,可以将编译器分为编译器前端、编译器中端、编译器后端,并对编译器前端、编译器中端、编译器后端进行独立的实现。其中,编译器前端主要负责预处理、词法分析、语法分析、语义分析,生成便于后续处理的中间表示(intermediaterepresentation,IR)等;编译器中端进行分析和各种优化,例如常量折叠、死代码消除等;编译器后端负责生成目标代码(编译代码或机器码),目标代码为平台相关的汇编代码。其中,若程序处理过程中只存在一个编译器,该编译器在生成目标代码后会进一步将汇编代码转译为机器码。
下面以图2所示的内容为例,示例性的介绍编译器的工作原理。
图2为本申请涉及的编译器工作原理的一个示例性示意图。
如图2所示,编译器根据程序源码识别程序所使用的编程语言,按照编程语言定义的词法、语法和语义进行分析,之后生成后端机器无关的中间代码IR序列,IR序列也是程序的表示,只是面向编译器,由编译器来理解和处理。平台无关的中间代码IR,由编译器后端翻译成面向具体硬件和平台的机器码(machine code)。
对于本申请涉及的WebAssembly(WASM)语言下的编译器则是将则是将源程序编译为二进制格式。其中,二进制格式有两种:一种是WASM二进制格式,WASM二进制格式是平台无关的二进制,配合WASM运行时,相当于JAVA语言的字节码。其中,WASM二进制格式可以进一步被翻译为目标机器码二进制格式。
值得说明的,为了方便开发者理解WASM模块,WASM还提供了更容易理解的文本格式。
(3)解释执行、提前编译(ahead of time compilation,AOT)、即时编译
操作系统中,目标程序通常有三种执行方式:解释执行、提前编译、即时编译。
解释执行包括:解释器解释执行一条或多条字节码。
提前编译包括:编译器将字节码进一步翻译为机器目标码,并存储在存储介质中。值得说明的是,提前编译的时刻为运行应用程序前进行编译,例如在安装应用程序时。
即时编译包括:在字节码被运行时加载或解释执行时刻,将字节码编译为机器目标码执行。即时编译结果仅存在于运行时内存,并不存储于存储介质。
其中,不同平台的机器对应的机器码可以不同,不同目标程序在不同平台上的代码可以为不同的高级语言代码如C、Java、Python等。
例如,当目标程序的源代码为C语言时,被不同方式编译后的机器码可以是汇编语言;当目标程序的源代码为Java语言时,由于Java目标程序在虚拟机中执行,首先Java目标程序被编译为字节码文件,并加载到Java虚拟机中,此时虚拟机可以通过解释执行、即时编译将字节码转变为机器码后执行。
(4)物理地址、虚拟地址
物理地址为具体物理硬件可识别并访问的地址。虚拟地址为操作系统认可的应用程序内可识别并访问的地址。
目标程序经过编译、汇编、连接等处理生成可执行的二进制机器目标代码时,会被映射到虚拟地址空间。对于采用虚存机制的操作系统,指令中给出的地址是虚拟地址,CPU执行指令时,首先要将虚拟地址转换为物理地址,才能到主存取指令和数据。地址转换(addresstranslation)工作由CPU中的内存管理单元(memorymanagementunit,MMU)完成。
下面以图3所示的内容为例,示例性的介绍物理地址与虚拟地址之间的关系。
图3为本申请涉及的地址转换的一个示例性示意图。
如图3,分别运行目标程序1和目标程序2时,都会执行“call虚拟地址指令”。对于不同的目标程序,相同的虚拟地址经过MMU转换为不同的物理地址1,和物理地址2。
值得说明的是,在本申请实施例提供的编译时提前链接方法中,当电子设备不具备MMU,或者是电子设备上的MMU未使能时,会将符号的“临时地址”更新为物理地址。例如,A-Profile架构的ARM处理器,如ARMv7-A支持通过系统控制寄存器来进行配置MMU。
(5)静态链接、动态链接
电子设备在运行一个应用程序时,会将该应用程序所使用到的所有资源全部分配到一段进程独立的PM(Program Memory)空间中。而在这段PM空间中会存放当前应用程序在运行过程中需要使用到的各类标准段,以及其他的附加段结构数据。每一个应用程序所对应的PM空间,均是基于该应用程序的独立虚拟地址空间(Virtual Address Space,VAS)进行创建的。在同一个操作系统中,每一个应用程序的可用VAS大小均保持一致。当应用程序运行时,PM空间中各类段结构数据在实际物理内存中的存储位置,会由操作系统根据当前的系统情况自动进行分配。而数据的实际存储容器可能是当前计算机的物理内存,或是flash memory/硬盘等其他类型存储介质。
在编译时,编译器不知道符号的物理地址,会暂时使用一个“临时地址”,并在编译后的文件中保存重定位段(relocation section)和符号表(symboltable),以告知链接器哪些符号需要重定位以及需要确定物理地址的相关信息。根据符号是否是编译单元内部定义的,可以将符号分为内部符号和外部符号。其中,内部符号为编译单元内部定义的;外部符号为编译单元外部的其他文件中定义的。其中,编译单元也可以称为模块。WebAssembly中可分发、可加载和可执行的代码单元称为模块。
当被链接的库不是可重入的情况下,介绍静态链接和动态链接:
静态链接时,链接器首先分析目标程序,对目标程序中的数据段、代码段等进行合并;其次,对目标程序中的符号进行重定位。对于内部符号来说,可以通过将符号定义与符号引用之间的偏移保存在重定位信息,在加载时由链接器确定符号的物理地址。对于外部符号来说,需要打开外部符号文件,作为目标程序的一部分一起映射到目标程序的虚拟地址空间。
可以理解的是,静态链接要求每个目标程序对应的可执行文件对所有需要的外部库都要有一份副本,当多个程序依赖于相同的库函数时,多个相同的库函数副本占据了内存的大量空间,增加了内存开销。
为了降低内存开销,可以让目标程序在加载入内存时进行链接,即动态链接。动态链接可以分为两种情况:其一,被链接的文件不是地址无关(position independent code,PIC)编译的;其二,被链接的文件是PIC编译的。
若被链接的文件不是PIC编译的,则在链接的重定位过程中,需要修改被链接的文件中代码段的内容,如Linux操作系统下.so的共享库的偏移地址,本质上是不安全的。或者,为了提高动态链接的安全性,链接器可以为不同的目标程序的VAS内分配一个独立且完整的共享库实例副本,增加了内存开销。
若被链接的文件时PIC编译的,在链接的重定位过程中,被链接文件内的符号重定位过程的发生位置从原来的代码段(.text)转移到了全局偏移表(globaloffsettable,GOT)所在的数据段(.data)中,进而保障了被链接文件和目标程序的代码安全。同时,内存中的同一份共享库实例可以被映射到目标程序虚拟地址空间中的任何位置。
在实现目标程序和PIC编译的被链接文件的链接时需要使用GOT表,相当于二次间接访问物理地址,计算开销较大。
其中PIC编译可以参考下文中图7对应的文字描述,此处不再赘述。
(6)就地执行(XIP,eXceute In Place)
目标程序的进程的数据可以划分为数据段、BSS段、代码段、堆、栈。在哈佛结构下,代码段存储在只读存储器(Read Only Memory,ROM)/或flash memory中,数据段存储在随机存取存储器(Random Access Memory,RAM)中。其中,ROM为可以随时读取但是不能随意更新的存储器;flash memory属于广义的ROM,为可以读写的存储介质,但是写操作的速度较慢;RAM为可以读写的存储介质。
XIP运行是指目标程序无需将目标程序的代码段读入到RAM中,可以直接在flashmemory或ROM上运行。
与XIP运行相对的为非XIP运行。非XIP运行是指目标程序需要将目标程序的代码段读入到RAM中,再由处理器从RAM执行代码运行。
实现XIP运行的一个方法为:在编译阶段,对目标程序使用地址无关(positionindependent code,PIC)编译,PIC编译会将需要修改地址的符号分离出来,并与数据段一起装载进入RAM中。而剩余的部分,如代码段,则为地址无关的内容,可以存放在ROM或flashmemory中。
可以理解的是,对目标程序进行PIC编译,可以实现目标程序的XIP运行。
值得说明的说,XIP也可以称为直接执行、芯片内执行。
下面以图4所示的内容为例,示例性的介绍XIP运行与非XIP运行之间的区别。
图4为本申请涉及的XIP运行与非XIP运行的一个示例性示意图。
如图4所示,对于非XIP运行来说,首先,目标程序对应的可执行文件会被加载到RAM中,即该可执行文件中的数据段、代码段会被加载到RAM中。在该过程中,需要确定代码段和数据段中符号引用的物理地址,即需要将编译时生成的“临时地址”修正为正确的引用地址。即,在CPU目标程序的某个指令前,需要完成符号的重定位。
对于XIP运行来说,目标程序对应的可执行文件中的数据段、堆、栈会被加载到RAM中,而代码段(代码段包括只读数据段)会被加载到ROM/flash memory中。当CPU执行目标程序的某个指令时,可以直接从ROM/flash memory中读取指令,执行。
可以理解的是,XIP运行相比于非XIP运行,由于不需要将目标程序拷贝到RAM中,提高了目标程序的启动速度。其次,由于不需要对代码段中的内容做修改,且哈弗计算机结构读取ROM/flash memory的速度比读取RAM速度更快,所以XIP运行相比于非XIP运行可以提高目标程序的流畅度,提高用户的体验。
其次,下面介绍本申请涉及的两种对目标程序编译的方法。
其一,下面以图5A以及图5B所示的内容为例,示例性的介绍WAMR中的提前编译方法。
WASM作为一种面向Web的二进制格式,可以支持包括JavaScript、C、C++等多种语言编写的程序运行在服务器、移动电子设备或IoT设备上。WAMR可以对目标程序进行提前编译,其具体的过程如下图5A、图5B所示。
图5A为本申请涉及的WAMR中提前编译的一个示例性示意图。
WARM中的编译器在编译目标程序时,在编译包括符号引用的指令进行时,会将一个临时地址替代该符号引用放在目标程序对应的可重定位文件中,并且会生成对应的重定位信息。
例如,对于图5A中的“callaot_func#0”这一指令,该指令中包括符号引用“aot_fun#0”,aot_fun#0为一个函数(函数名)。编译器在编译该指令时,会将该指令编译为“call临时地址”的形式。该临时地址会在后续步骤中,被链接器刷新为aot_func#0符号定义的物理地址。
对应的,编译器需要将需要被刷新的符号引用的位置的相关信息保存在重定位组中的重定位条目中。后续步骤中,链接器可以获取重定位组,并基于重定位组中信息确定需要被刷新“临时地址”的位置,以及确定刷新后该符号引用对应的物理地址。
如图5A所示,编译器生成所有的重定位信息构成目标程序的重定位段(relocation section),重定位段包括符号表(symbol table,symtab)、重定位组(relocation groups)。其中,重定位组包括代码段重定位组(groups for code section)和数据段重定位组(groups for data section),代码段重定位组也可以称为重定位代码段(.rel.txt)和重定位数据段(.rel.data)。其中,符号表存放有函数名和变量名;代码段重定位组中存放有代码段中符号引用的重定位条目,用于修改代码段的指令中的“临时地址”;数据段重定位组存放有数据段中的符号引用的重定位条目,用于修改代码段的指令中的临时地址。
其中,符号的重定位条目可以包括:符号标识(symbol ID)、偏移(offset)、偏移量加数(addend)。其中,符号标识用于唯一标识该符号;偏移用于表示需要后续链接时需要修改地址的位置与段基址的偏移;偏移量加数用于对重定位偏移进行调整。
目标程序被编译器编译后,会生成该目标程序对应的目标文件。目标文件作为可重定位文件在被加载到内存时后,进行链接。在链接过程中,由链接器基于编译器生成的重定位条目刷新“临时地址”,完成符号的重定位。可重定位文件被链接后,会成为可执行文件。
其中,链接器对目标文件进行重定位的过程如图5B所示。
图5B为本申请涉及的目标文件的链接时重定位的一个示例性示意图。
如图5B所示,链接器对目标文件中的符号进行重定位的方法主要包括:
S5B01:操作系统加载目标程序提前编译后的文件。
S5B02:重建符号表,将符号映射到内存中的物理地址。
S5B03:循环处理重定位组,更新重定位组中每个元素在内存中的物理地址。
在步骤S5B03中,链接器根据符号表确定哪些符号需要被重定位,并基于该符号对应的重定位条目,计算得到该符号的物理地址,并将“临时地址”更新为符号的物理地址。
其中,链接器如何根据重定位条目计算得到符号的物理地址取决于操作系统。例如,链接器可以采用PC相关寻址确定内部符号的物理地址,或者链接器可以采用GOT表寻址确定外部符号的物理地址。
其中,PC相关寻址可以参考下文中图6A对应的文字描述,GOT表寻址可以参考下文中图6B对应的文字描述,此处不再赘述。
可以理解的是,由于提前编译后的目标文件包括重定位段,增加了目标文件的体积,增加了内存的开销;其次,由于需要运行时更新编译时配置的“临时地址”,降低了目标程序启动、运行的速度。
值得说明的是,目标文件相当于图1中的可重定位文件,需要被加载到RAM中进行链接时重定位,即经过提前编译的文件只能非XIP运行。
下面结合图6A、图6B所示的内容,分别示例性的介绍PC相关寻址以及GOT表寻址的内容。
图6A为本申请涉及的PC相关寻址的另一个示例性示意图。
如图6A所示,main.c中的代码main()函数引用了模块外部定义的swap()函数,swap()函数定义在swap.c。
编译器在编译main.c时并不知道swap函数的物理地址,对swap()函数编译生成的汇编代码为“6:e8 fcffffff”,其中“fcffffff”(-4)为swap()函数的“临时地址”,“e8”(call指令的操作码)为操作码。在汇编的同时,会生成swap()函数对应的重定位条目。其中,swap函数对应的重定位条目包括:偏移为0x7B、符号标识为swap、定位类型为PC相关寻址。其中,偏移0x7标识第7字节开始重定位,即e8后的“fcffffff”地址需要修改。
在链接时,链接器对源程序和被链接的文件进行合并,代码段中swap()函数紧跟在main()函数后。假设main()函数从相对代码段的偏移为0处开始,占据0x12(18字节空间占用)。
在链接时,可执行文件中main()函数对应的机器码从物理地址0x8048380开始,即main()函数的首地址为0x8048380。由于swap()函数紧跟在main()函数后面,则swap()函数对应的机器码的首地址为0x8048380+0x12=0x8048392。进一步的,若机器码的首地址按4字节边界对齐,则0x8048392+0x2=0x8048394,使得swap()函数对应的机器码的首地址0x8048394能被4整除。此时PC指针地址为call指令(近址相对偏移指令)下一条指令的地址为main的起始地址+b,即为0x804838b。偏移地址=0x8048394-0x804838b=0x9。目标程序运行时,链接器修改“e8fc ff ffff”为“e8 09 00 00 00”。
目标程序运行时,根据修改后的“e8 09 00 00 00”可以正确访问swap()函数。
图6B为本申请涉及的GOT表寻址的一个示例性示意图。
如图6B所示,目标程序helloworld.c中调用了glibc动态库中的printf()函数,所以printf()函数为外部符号。在目标程序运行阶段,当CPU执行到printf()函数时,会基于printf()函数对应的PLT表项确定printf()函数的物理地址,进而完成重定位操作。
例如,printf()函数在PLT表项中的地址为printf@PLT,其中printf@PLT的确认主要通过如下四条代码实现:jmp*(printf@GOT);pushn;push ID;jump_dl_runtime_resolve。
其中,(printf@GOT)为GOT表中保存的printf()函数的物理地址。如果链接器已经初始化该项,则jmp跳转指令可以直接获取到printf()函数的物理地址。但是,在对目标程序的链接过程中,并不能确定printf()函数的物理地址并填入到GOT表中对应的位置中,故该指令在第一次调用printf()函数相当于空指令,进入第二条指令;pushn将一个数字n压入栈中,n为printf在PLT表的位置或下标,进入第三条指令;push ID为将目标程序的ID压入栈中;进入第四条指令,jump_dl_runtime_resolve为跳转执行_dl_runtime_resolv,其中_dl_runtime_resolv会调用动态链接器的_dl_runtime_resolv()函数确定printf()函数的物理地址,并写入printf@GOT中。其中,链接器会使用被压入栈中的n、ID作为_dl_runtime_resolv的输入进行寻址,确定printf()函数的物理地址。
可以理解的是,GOT表项寻址本质是二次间接寻址,其中,第一次寻址为PC指针到GOT表项的跳转,第二次为GOT表项到被引用符号的物理地址的跳转。PLT表用于实现延迟绑定,使得函数被调用时才进行函数的重定位。
其二,下面介绍本申请涉及的一种目标程序PIC编译方法。
为了降低将目标程序拷贝到RAM中的开销,一种目标程序PIC编译方法包括:将目标程序进行PIC编译,进而使得只需要将目标程序中的数据段拷贝到RAM中,实现了XIP运行,提高了目标程序的加载速度。
下面以图7所示的内容为例,示例性的介绍本申请涉及的一种目标程序PIC编译方法。
图7为本申请涉及的一种目标程序PIC编译方法的示例性示意图。
如图7所示,对目标程序PIC编译的方法包括:
S701:将目标程序的源代码编译为PIC的文件;
S702:根据重定位条目计算符号的重定位地址和需要填写到重定位地址的逻辑地址;
S703:将程序文件下载到flash memory后,直接运行。
其中,PIC编译时确定内部符号的物理地址的方式,以及PIC编译时确定外部符号的物理地址的方式,可以参考上文中图6A、图6B中对应的文字描述。
但是,可以理解的是,首先,该目标程序的加载方法使得编译后的目标程序中仍然包含重定位的相关信息,导致需要在目标程序的加载过程中对数据段进行重定位处理。其次,该方法要求对应用程序以及操作系统均采用PIC方式编译,而且需要强制预留一个通用寄存器用于装载GOT表。再次,PIC运行确定代码段的物理地址时增加了额外的对GOT的引用,以及一系列必须的额外的开销(比如对代码段地址的call和pop等),使得代码运行速度比非PIC运行的慢。最后,由于PIC编译需要对操作系统的内核进行一些修改,部分操作系统并不支持PIC编译,适用范围有限。
再次,下面介绍本申请提供的编译时提前链接的方法,以及基于该编译时提前链接的方法的一种目标程序的运行方法。
其一,首先介绍本申请提供的编译器时提前链接的方法。
本申请提供的编译时提前链接的方法,在提前编译阶段,由编译器使用PC相关寻址完成对内部符号的重定位;剩余的外部符号重定位分为两种情况,若是操作系统可以提供外部符号的物理地址,则完成外部符号的重定位;若是操作系统不知道外部符号的物理地址,则等待运行时分配PLT表项,借助PLT表项获取外部符号的地址,进而完成重定位。
很显然的,由于内部符号、外部符号的重定位都不依赖重定位条目,可以删除提前编译输出的目标文件中的重定位段、符号表或者不生成重定位段、符号表。
图8为本申请实施例提供的实现编译时提前链接的方法后目标文件的一个示例性示意图。
如图8所示,本申请提供的编译时提前链接的方法,对于不能在提前编译时获取物理地址的外部符号,通过保存该符号的符号引用与PLT表中PLT表项的偏移值,建立符号引用与PLT表项之间的映射关系。其中,与该符号对应的PLT表项保存有该符号的物理地址。
很显然的,与图5A、图5B所示的WAMR中提前编译方法不同的是,本申请提供的编译时提前链接的方法,首先,类似于图6A所示的PC相关寻址方法,在目标程序编译时完成了对内部符号的重定位,但是,是由编译器而非链接器完成内部符号的重定位;其次,在目标程序提前编译时只需要确定PLT表项与符号之间的映射关系,在运行时通过访问PLT表,即可以完成外部符号的引用。其中,实时操作系统(real-timeoperatingsystem,RTOS)导出目标程序所需要符号的物理地址至目标程序的PLT表中。所以,输出的目标文件中不包括重定位段和符号表,降低了后续运行时内存的开销。
很显然的,与图7所示的PIC编译方法不同的是,本申请提供的编译时提前链接的方法,首先不需要对目标程序执行PIC编译,提高了编译方法的适用范围;其次也不需要借助GOT表确定外部符号的物理地址,进而降低了借助GOT表确定外部符号的物理地址时需要的内存开销和计算开销。
下面具体的介绍本申请实施例提供的编译时提前链接的方法的流程。
图9为本申请实施例提供的编译时提前链接的方法的一个示例性示意图。
如图9所示,本申请实施例提供的编译时提前链接的方法包括:
S901:电子设备获取目标程序后,对目标程序进行提前编译,在提前编译时完成目标程序的内部符号、外部符号的重定位。
电子设备在获取到目标程序后,可以对目标程序进行提前编译;或者电子设备在获取到目标程序后,在安装时,对目标程序进行编译;或者,目标程序版本更新后,对更新后的目标程序进行编译。
电子设备的编译器在提前编译目标程序时,通过PC相关寻址完成内部符号的重定位,通过PLT表的间接跳转完成外部符号的重定位。
其中,目标程序可以是WASM字节码格式的。其中,电子设备可以有多种方式获取目标程序,例如,可以从应用商店下载获取、或者网络下载获取等多种方式获取,在此不作限定。
其中,PLT表为操作系统在目标程序运行时为该目标程序分配的,PLT表中有多个PLT表项,每个PLT表项保存有被编译目标程序的外部符号的物理地址。
下面结合图10所示的内容,示例性的介绍获取目标程序的过程。
图10为本申请实施例提供的获取目标程序的一个示例性示意图。
如图10所示,电子设备如手表、手环、VR/AR眼镜、家居设备等,可以通过应用商店或网络等多种方式下载目标程序如应用程序或驱动程序。
当目标程序为WASM格式时,不同平台的设备可以获取该目标程序,在提前编译时将该目标程序编译为平台相关的可执行文件。其中,该可执行文件可以为机器码格式的。
1:下面结合图11所示的内容,示例性的介绍编译器完成目标程序的内部符号、外部符号的重定位的过程。
1.1:在编译器内部增加一个或多个用于完成内部符号和外部符号的重定位的函数。
1.1.1考虑到编译器本身并不会对符号进行重定位,需要在提前编译中新增加一个用于完成重定位的函数,例如aot_do_relocation。
其中,用于重定位的函数可以获取编译器生成的指针,如AOTObjectData指针,并且可以复制待链接的代码段和数据段。其中,复制待链接的代码段和数据段这一操作可以在第一次修改代码段和数据段内容时。
该用于重定位的函数,例如aot_do_relocation,可以对图5A中的重定位组中的代码段重定位组和数据段重定位组适配不同的处理方法。例如对代码段重定位组调用do_text_relocation函数、对数据段重定位组调用do_data_relocation函数,进而完成对代码段和数据段中内部符号的重定位。
其中,代码段的重定位函数do_text_relocation函数或者数据段的重定位函数do_data_relocation函数中包括多种架构相关的重定位函数。例如,do_text_relocation函数在遍历代码段对应的重定位条目后,会选择架构相关的重定位函数对重定位条目进行处理,如do_thumb_text_relocation函数。
1.1.2考虑到目标文件应该是平台相关的二进制代码,在重定位函数执行前或重定位函数执行时,需要确定电子设备的架构。进而根据不同的电子设备的体系架构,选择架构相关的重定位函数。
例如,上文中图10所示的内容,一个WASM格式的目标程序,可以被分发到不同平台的电子设备上。
本申请实施例提供一组标准操作、接口,输入参数为具体的架构的名称和标识,输出结果包括:输入参数对应架构的PLT表及相关属性,重定位操作的具体回调函数。
其中,架构的名称和标识可以是thumbv7、aarch64等,在此不作限定。其中,PLT表及相关属性可以包括表项总数、每个表项的大小、函数名对应的PLT表项索引等中的部分或全部,在此不作限定。其中,重定位操作的具体回调函数的输入参数可以包括当前处理的段指针、待定位的符号和段首间的偏移、重定位类型、参考符号信息等,在此不做限定。
1.2:在编译器内部增加一个标识参数,该标识参数用于表示被编译的目标程序是否完成了内部符号、外部符号的重定位。
例如,可以在编译器内部配置一个参数(例如relocation_group_count)用于告知操作系统是否完成了编译时重定位。
可以理解的是,通过该标识参数,编译器后端可以确定该目标程序是否完成了提前编译时的重定位。若提前编译时完成了所有的内部符号和外部符号的重定位,则编译器后端生成的目标文件可以不包括重定位信息。若提前编译时没有完成所有的内部符号和外部符号的重定位,则编译器后端生成的目标文件可以包括重定位信息。
1.3:具体的介绍编译器编译目标程序的过程。
下面结合图11所示的内容,示例性的介绍处理目标文件中的重定位组的过程。
图11为本申请实施例提供的处理目标文件中的重定位组过程的一个示例性示意图。
如图11所示,当电子设备的CPU架构为thumbv7架构时,编译器通过本申请实施例提供的标准操作获取当前电子设备的架构为thumbv7后,若使用do_text_relocation函数对代码段进行重定位,则do_text_relocation函数中会调用do_thumb_text_relocation进行重定位;若使用do_data_relocation函数,则do_data_relocation函数中会调用do_thumb_data_relocation进行重定位。若电子设备为aarch64架构时,编译器通过本申请实施例提供的标准操作获取当前电子设备的CPU架构为aarch64后,若使用do_text_relocation函数对代码段进行重定位,则do_text_relocation函数中会调用do_aarch64_text_relocation进行重定位;若使用do_data_relocation函数,则do_data_relocation函数中会调用do_aarch64_data_relocation进行重定位。其中,认为do_thumb_text_relocation、do_thumb_data_relocation、do_aarch64_text_relocation、do_aarch64_data_relocation为架构相关的重定位处理函数。
其中,架构相关的重定位处理函数可以按照不同架构的应用程序二进制接口(Application Binary Interface,ABI)手册定义方式计算出符号的物理地址,或者间接表示符号物理地址的偏移。
可以理解的是,通过本申请实施例提供的一组标准操作,可以获取对应架构的重定位格式、规则等,为提前编译时完成重定位提供了基础,同时保证了被提前编译生成的目标文件为平台相关的。
在获得了架构相关的重定位函数后,可以利用架构相关的重定位函数完成内部符号和外部符号的重定位。
架构相关的重定位函数会完成内部符号的重定位和外部符号的重定位:
其一,内部符号基于PC相关寻址完成重定位。例如,编译器会将PC指针与符号定义之间的偏移量填入符号引用处的地址,并使用call指令(近址相对偏移指令)完成符号调用。
图12A为本申请实施例提供的PC相关寻址的一个示例性示意图。
如图12A所示,目标程序的源代码中,foo()函数调用了模块内部定义的bar()函数。编译器可以用一条call指令(近址相对偏移指令)实现bar函数的调用,例如“e8dbffffff”。其中,“e8”(call指令的操作码)为操作码,“dbffffff”(-0x25)为PC指针与bar()函数物理地址之间的偏移。PC指针的地址为0x 8048369,则bar()函数物理地址为0x8048369+(-0x25)=0x8048344。其中,PC指针为正在被CPU执行指令的下一条指令所在的物理地址。
可选的,在本申请一些实施例中,可以使用其他方式完成内部符号的重定位。
其二,外部符号通过PLT表间接跳转完成重定位。首先,由于PLT表与目标文件的代码段、数据段基址的偏移量是固定的。并且,操作系统可以指定运行时PLT表内部的PLT表项相对位置固定。可以通过基于PC相关寻址的方式确定任意一个PLT表项的物理地址。
例如,第N个外部符号对应的PLT表项的地址=代码段基址+代码段大小+最小对齐间隙+(N-1)*PLT表项大小,则相对于代码段基址的偏移为代码段大小+最小对齐间隙+N*PLT表项大小。
值得说明的是,若是在提前编译时,操作系统可以提供外部符号的物理地址,则对于编译器来说,该外部符号为可见的,则该外部符号的重定位不需要经过PLT表项间接跳转,直接在该外部符号的引用处填入该外部符号的物理地址,并在后续的过程中不生成该外部符号对应的PLT表项。
可选的,在本申请一些实施例中,若是对于非“PC-相关”等无法处理的情况,可以返回如图5A所示的流程进行处理。
可选的,在本申请一些实施例中,新增的用于重定位的函数可以位于原有的编译器中文件输出函数中,如aot_emit_aot_file中。
可选的,在本申请一些实施例中,可以在编译器前端配置一个标识,该标识的值由用户或软件开发人员配置,用于判断是否执行本申请实施例提供的编译时提前链接的方法。例如,该标识可以是enable-pre-link,若enable-pre-link标识为True,则可以按照本申请实施例提供的编译时提前链接的方法进行编译;若enable-pre-link标识为False,则按照默认的流程进行提前编译以及后续处理。
S902:生成不包含重定位信息的目标文件。
具体的,修改编译器的重定位段输出函数,例如aot_emit_relocation_section函数,当步骤S901完成了编译时重定位,则在目标文件当前位置输出0,以省略后续对重定位段的输出。
其中,可以根据参数relocation_group_count判断步骤S901中是否完成了编译时重定位。
可以理解的是,由于在步骤S901中,编译器已经完成了符号的重定位,可以删除重定位段,以缩减目标文件的体积,降低内存的开销。
在执行完步骤S902后,运行时操作系统会按照默认的流程生成PLT表,其中PLT表中的PLT表项中有外部符号的物理地址。
图12B、图12C本申请实施例提供的编译时提前链接输出的目标文件代码段的一个示例性示意图。
如图12B所示,在提前编译输出的目标文件中PLT表的位置位于代码段后。若目标程序的代码段的基址为0x8048300,且代码段的大小为0x20,且PLT表项的大小为0x4。则PLT表中第二个PLT表项的物理地址为0x8048300+0x200+0x4=0x8048504。若是考虑边界对齐,则需要对0x8048504+最小对齐间隙。在确定PLT表项的物理地址后,通过类似“call*0x8048504”的方式,将0x8048504地址上保存的内容作为地址去调用,可以实现对第二个PLT表项对应的外部符号的调用。
如图12C所示,在确定符号引用和PLT表项的对应关系后,需要借助PLT表项确定符号的物理地址。例如,以外部符号aot_invoke_native函数为例,其对应的PLT表项的伪代码为:pushrx;lirxaddr_of(aot_invoke_native);call rx;poprx;ret。其中,pushrx为将rx压栈,然后为rx赋值为aot_invoke_native函数的物理地址;通过call指令访问该地址;弹出栈;结束。其中,图12C所示的目标文件代码段和PLT表均位于内存中。
可以理解的是,任一外部符号对应的PLT表项的物理地址可以通过PC相关寻址确定,而PLT表项中又保存着外部符号的物理地址,故实现了外部符号的重定位。
可选的,在本申请一些实施例中,对于compiler-rt类函数,如在Cortext-M4处理器上为了支持双精度浮点运行而引入的__eabi_dadd、__eabi_dsub等函数,这些外部符号可以通过静态引入当前代码段,作为内部符号进行重定位,即不在PLT表中。
很显然的,本申请实施例提供的编译时提前链接方法,相比于图5A、图5B所示的WAMR中的编译方法,生产的目标文件中不包含重定位段,极大的降低了目标文件的体积,降低了内存的开销。
考虑到本申请实施例提供的编译时提前链接方法生成的可执行文件为位置无关的文件,在实现本申请实施例提供的编译时提前链接的方法后,可以进一步增加步骤,使得提前编译生成的目标文件可以XIP运行。
下面介绍本申请实施例提供的目标程序的运行的方法。
图13为本申请实施例提供的目标程序的运行方法的一个示例性示意图。
如图13所示,本申请提供的目标程序的运行方法包括:
S1301:电子设备获取目标程序后,对目标程序进行提前编译,根据操作系统提供的导出符号表,完成内部符号、外部符号的重定位。
嵌入式获取目标程序的方法、内部符号的重定位方法可以参考上文中步骤S901中的文字描述。
外部符号的重定位依赖于步骤S1302中提供的导出符号表,其中,导出符号表中保存有提前编译该目标程序时所需要的外部符号的物理地址。在获取到外部符号的物理地址后,完成外部符号的重定位。
其中,导出符号表为RTOS和/或WAMR提供的。
S1302:传递导出符号表。
具体的,由于编译器本身不能确定外部符号的地址,需要RTOS和/或WAMR向编译器提供导出符号表,其中,导出符号表中保存有外部符号的地址。在运行时,目标文件就可以依据导出符号表的基址获取到导出符号表,进而获取到外部符号的地址。
其中,RTOS提供导出符号表基址的方式可以有很多种,在此不作限定。
图14为本申请实施例提供的操作系统向编译器提供导出符号表的一个示例性示意图。
如图14所示,操作系统可以通过多种方式提供导出符号表,并将导出符号表的内容写入PLT表中。
RTOS和/或WAMR可以与编译器约定预留一个寄存器(如静态基址寄存器(staticbase address register,SBR))存放RTOS的导出符号表,RTOS启动目标文件时,需确保导出符号表正确初始化,且基址以及装入寄存器中;目标文件读取寄存器,并按照约定偏移寻址访问函数的实际PC,利用基于寄存器的call指令完成函数调用。
或者,RTOS和/或WAMR增加一个额外的参数传输导出符号表的基址,该参数的值会在RTOS调用编译器时,编译器从RTOS传入的参数中获得。
或者,RTOS和/或WAMR将导出符号表以配置文件的形式保存在本地,在RTOS启动目标文件时,使得编译器读取该配置文件。
可选的,在本申请一些实施例中,导出符号表可以包括除该目标程序所需要的外部符号之外的符号的物理地址,进而使得其他的目标程序可以使用同一个导出符号表。
值得说明的是,导出符号表中的内容可以包括其他目标文件中定义的函数、变量。
S1303:生成不包含重定位信息的目标文件,并将目标文件输出到ROM/flashmemory中。
具体的,生成不包含重定位信息的目标文件,可以参考步骤S902中的文字描述,此处不再赘述。将目标文件的代码段和导出符号表输出到ROM/flash memory中,具体的输出方法可以通过扩展原有的文件输出函数实现。
例如,扩展原有的编译器的目标文件输出函数可以包括:
新增一个函数,例如aot_emit_plt_table函数,该函数是会根据当前的电子设备架构,选择架构相关的函数,如aot_emit_thumb_plt_table函数,该函数会将导出符号表的内容输出到一个buffer中,并返回buffer大小等信息。
扩展aot_emit_text_section函数,调用aot_emit_plt_table并将返回的buffer追加到当前代码段buffer之后(可以按照架构规范进行必要的对齐),然后将代码段的大小做相应的调整,并对导出符号表中的内容进行处理。其中,对导出符号表中的内容处理与步骤S1303中获取导出符号表基址的方式有关。
下面以图15A、图15B、图15C的内容为例,示例性的介绍编译器获取导出符号表的方式。
图15A、图15B、图15C为本申请实施例提供编译器获取导出符号表方法的一个示例性示意图。
例如,在步骤S1302中,RTOS和/或WAMR协作增加一个额外的参数传输导出符号表的基址。
例如,该参数为WAMR的WASMExecEnv结构体中追加的指针参数。该参数可以存放WAMR提供的导出符号表。WASMExecEnv结构体指针会作为第一个参数传递给所有的函数(如图5A中的aot_fun#0、aot_fun#1等)或其他模块、或WAMR的运行时导出函数(如图5A中的aot_invoke_native、aot_set_exception_with_id等)。
如图15A所示,WASMExecEnv结构体通过“void**global_api_table”追加了一个指针。该指针用于保存导出符号表的引用。WASM运行时将导出符号表传递给被编译的目标程序。该指针存的地址可以通过WASMExecEnv结构体的首地址和该指针与WASMExecEnv结构体的首地址的偏移确定。目标程序在提前编译时,由于WASMExecEnv结构体含有global_api_table指针,可以直接从获取导出符号表的基址,进而获取外部符号的物理地址。
如图15A以及图15B所示,以aot_invoke_native为例,示例性的介绍对导出符号表的处理过程。
aot_invoke_native函数的第一个参数为WASMExecEnv结构体指针,假设WASMExecEnv结构体指针的地址为r0,则gobal_api_table指针的地址为r1=r0+GLOBAL_API_TAB_OFFSET。编译器只需要根据aot_invoke_native函数索引确定该函数的物理地址。在确定该函数的物理地址后,可以通过基于寄存器的跳转指令实现函数的调用。
其中,aot_invoke_native函数索引的获取方式可以参考图15C所示的内容:“pushrx;rx<--{导出符号表地址};rx<--rx(函数在导出符号表的索引);if rx==null;then;handle_exception(“PERMISSION DENIED!”);else;call rx;endif;pop rx;ret”。
值得说明的是,对于无法获取用于传递导出符号表的参数的函数,如LLVM后端指令选择阶段自动插入的compiler-rt类函数,可以在LLVM后端生成该函数时在该类函数的参数列表中追加一个用于传递导出符号表的参数。
可以理解的是,步骤S1303后,编译器输出的目标文件为位置无关的,已经完成重定位的文件。
S1304:忽略运行时PLT表分配、内存分配,并运行该目标文件。
首先,由于在提前编译时以及完成了重定位操作,并且代码段输出到ROM/flashmemory中,可以跳过操作系统在加载目标文件时进行的重定位操作,以及在运行时为目标文件分配PLT表的过程。其次,由于目标文件可以在ROM/flash memory中运行,不需要通过os_mmap等其他方式将目标文件的代码段映射到RAM中,可以将目标文件中的代码段基址作为代码段地址执行。
可选的,在本申请一些实施例中,若电子设备配置有内存保护单元(MemoryProtect Unit,MPU),可以配置一个单独的MPU Region并赋予执行权,使得目标文件可以执行。
可选的,在本申请一些实施例中,可以单独分配一块内存用来存放该导出符号表以实现类似图16所示的动态权限,即按照权限分配情况设置每个表项的值,来实现动态权限控制。
可以理解的是,本申请提供的编译时提前链接的方法可以删除重定位段,降低目标文件的体积,进而减少RAM的开销。
可选的,在本申请一些实施例中,在步骤S1301中,可以增加一个编译器命令行选项--enable-xip用于控制是否需要启用XIP运行。若启用XIP运行,则实施本申请实施例提供的目标文件运行的方法;若不启用XIP功能,则按照默认流程执行。
可选的,在本申请一些实施例中,可以增加一个针对电子设备的过滤参数,使得对于不支持XIP运行或XIP运行收益不明显收益的平台,如x86、aarch64等,可以不启用XIP功能。
再次,下面以图16所示的内容为例,示例性的介绍对目标程序实施编译时提前链接的场景;以及以图17所示的内容为例,示例性的介绍对目标程序实施例编译时提前连接以及XIP运行的场景。
图16为本申请实施例提供的目标程序实施编译时提前链接时权限动态分配的一个示例性示意图。
如图16所示,当手表上的目标程序的某些功能调用了外部符号对应的函数,该外部符号对应的函数可以获取用户的定位信息,但是,在提前编译时该函数的物理地址未知。在用户启动目标程序后,该目标程序的界面会提示用户是否允许该目标程序获取定位权限。若用户同意,选择“是”后RTOS会更新PLT表,使得目标程序可以获取该函数的物理地址;若用户不同意,选择“否”后RTOS不会更新PLT表,使得目标程序不可以获取该函数的物理地址。
图17为本申请实施例提供的目标程序实施编译时提前连接以及XIP运行时静态权限分配的一个示例性示意图。
如图17所示,当手表上的目标程序的某些功能调用了外部符号对应的函数,该外部符号对应的函数可以获取用户的定位信息以及联系人信息。在用户启动目标程序后,该目标程序的界面会提示用户是否允许该目标程序获取定位权限以及联系人权限。若用户允许目标程序获取定位权限以及联系人权限,则目标程序可以正常运行;但是,若用户不允许目标程序获取定位权限或/和联系人权限,则目标程序不可以正常运行。
可以理解的是,当导出符号表的内容位于ROM/flash memory中时,并不能随意刷新ROM/flash memory中的数据,所以只有目标程序需要的权限与提前编译时分配该目标程序的权限完全一致时,目标程序才能正常运行。类似的,若目标程序依赖的外部符号在RTOS中的物理地址发生变化,如系统更新、库函数内容更新、库函数位置变化等情况,此时目标程序不能正常运行。
可以理解的是,在XIP运行模式下,目标程序可以通过WAMR提供的导出符号表访问外部符号,通过限制不同的目标程序可访问的外部符号的范围,可以实现对不同目标程序的权限管理。其次,通过为不同的目标程序设置不同的导出符号表,可以实现差异化的权限管理。
最后,下面介绍本申请提供的电子设备。
本申请实施例中电子设备可以为移动电子设备,也可以为智能家居设备等,在此不作限定。
图18为本申请实施例提供的电子设备100硬件结构的一个示例性示意图。
下面以电子设备100为例对实施例进行具体说明。应该理解的是,电子设备100可以具有比图中所示的更多的或者更少的部件,可以组合两个或多个的部件,或者可以具有不同的部件配置。图中所示出的各种部件可以在包括一个或多个信号处理和/或专用集成电路在内的硬件、软件、或硬件和软件的组合中实现。
电子设备100可以包括:处理器110、总线和接口120、随机存取存储器(randomaccess memory,RAM)130、非易失性存储器(non-volatile memory,NVM)140、传感器模块150、通信模块160、显示模块170等。其中,非易失性存储器中包括ROM/flashmemory。
可以理解的是,本发明实施例示意的结构并不构成对电子设备100的具体限定。在本申请另一些实施例中,电子设备100可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
处理器110可以包括一个或多个处理单元,例如:内存管理单元(memorymanagement unit,MMU)、内存保护单元(memory protection unit,MPU)、运算器、控制器、寄存器、数字信号处理器(digital signal processor,DSP),基带处理器,和/或神经网络处理器(neural-network processing unit,NPU)等。其中,不同的处理单元可以是独立的器件,也可以集成在一个或多个处理器中。
总线和接口120可以包括集成电路(inter-integrated circuit,I2C)接口,集成电路内置音频(inter-integrated circuit sound,I2S)接口,脉冲编码调制(pulse codemodulation,PCM)接口,通用异步收发传输器(universal asynchronous receiver/transmitter,UART)接口,移动产业处理器接口(mobile industry processor interface,MIPI),通用输入输出(general-purpose input/output,GPIO)接口,用户标识模块(subscriber identity module,SIM)接口,和/或通用串行总线(universal serial bus,USB)接口等。
可以理解的是,本发明实施例示意的各模块间的接口连接关系,只是示意性说明,并不构成对电子设备100的结构限定。在本申请另一些实施例中,电子设备100也可以采用上述实施例中不同的接口连接方式,或多种接口连接方式的组合。
随机存取存储器130可以包括静态随机存储器(static random-access memory,SRAM)、动态随机存储器(dynamic random access memory,DRAM)、同步动态随机存储器(synchronous dynamic random access memory,SDRAM)、双倍资料率同步动态随机存取存储器(double data rate synchronous dynamic random access memory,DDR SDRAM,例如第五代DDR SDRAM一般称为DDR5 SDRAM)等。
非易失性存储器140可以包括磁盘存储器件、快闪存储器(flash memory)。快闪存储器按照运作原理划分可以包括NOR FLASH、NAND FLASH、3D NAND FLASH等,按照存储单元电位阶数划分可以包括单阶存储单元(single-level cell,SLC)、多阶存储单元(multi-level cell,MLC)、三阶储存单元(triple-level cell,TLC)、四阶储存单元(quad-levelcell,QLC)等,按照存储规范划分可以包括通用闪存存储(英文:universal flashstorage,UFS)、嵌入式多媒体存储卡(embedded multi media Card,eMMC)等。
随机存取存储器130可以由处理器110直接进行读写,可以用于存储操作系统或其他正在运行中的程序的可执行程序(例如机器指令),还可以用于存储用户及应用程序的数据等。
非易失性存储器140也可以存储可执行程序和存储用户及应用程序的数据等,可以提前加载到随机存取存储器中,用于处理器110直接进行读写。
传感器模块150可以包括压力传感器、陀螺仪传感器、气压传感器、磁传感器、加速度传感器、距离传感器、接近光传感器、环境光传感器、指纹传感器、触摸传感器、骨传导传感器等。
通信模块160可以包括移动通信模块、无线通信模块。
显示模块170可以包括显示屏。
图19为本申请实施例提供的电子设备100软件结构的一个示例性示意图。
电子设备100的软件系统可以采用分层架构,事件驱动架构,微核架构,微服务架构,或云架构。
例如,电子设备的软件结构包括:应用层200、实时操作系统201、驱动层202。
应用层200可以包括中间件,应用程序包,驱动程序包。应用程序包可以包括相机,图库,日历,通话,地图,导航,WLAN,蓝牙,音乐,视频,短信息等应用程序。
实时操作系统201又称即时操作系统,它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。
驱动层202可以包括硬件相关的设备驱动程序。
本申请实施例提供的编译时提前链接方法,可以编译应用程序层的应用程序包、驱动程序包,进而减低对随机存取存储器130的占用,还可以通过本申请提供的XIP运行方法,将应用程序层的应用程序包、驱动程序包固化到非易失性存储器140上。
上述实施例中所用,根据上下文,术语“当…时”可以被解释为意思是“如果…”或“在…后”或“响应于确定…”或“响应于检测到…”。类似地,根据上下文,短语“在确定…时”或“如果检测到(所陈述的条件或事件)”可以被解释为意思是“如果确定…”或“响应于确定…”或“在检测到(所陈述的条件或事件)时”或“响应于检测到(所陈述的条件或事件)”。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机目标程序产品的形式实现。该计算机目标程序产品包括一个或多个计算机指令。在计算机上加载和执行该计算机目标程序指令时,全部或部分地产生按照本申请实施例该的流程或功能。该计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。该计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,该计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。该计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。该可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如DVD)、或者半导体介质(例如固态硬盘)等。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,该流程可以由计算机目标程序来指令相关的硬件完成,该目标程序可存储于计算机可读取存储介质中,该目标程序在执行时,可包括如上述各方法实施例的流程。而前述的存储介质包括:ROM或随机存储记忆体RAM、磁碟或者光盘等各种可存储目标程序代码的介质。
Claims (14)
1.一种编译时提前链接的方法,其特征在于,包括:
电子设备获取第一文件,所述第一文件包括第一应用程序的WASM字节码文件;
所述电子设备提前编译所述第一文件得到第一可就地执行文件;
所述电子设备在所述提前编译所述第一文件时进行第一程序的内部符号的重定位;
所述电子设备在所述提前编译所述第一文件时根据第一导出符号表进行第一程序的外部符号的重定位,所述第一导出符号表包括所述电子设备上系统函数和系统变量对应的符号的物理地址;
所述电子设备就地执行(XIP)所述第一可就地执行文件。
2.根据权利要求1所述的方法,其特征在于,还包括:
电子设备获取第二文件,所述第二文件包括第二应用程序的WASM字节码文件;
所述电子设备提前编译所述第二文件得到第二可就地执行文件;
所述电子设备在所述提前编译所述第二文件时进行第二程序的内部符号的重定位;
所述电子设备在所述提前编译所述第二文件时根据第一导出符号表进行第二程序的外部符号的重定位,所述第一导出符号表包括所述电子设备上系统函数和系统变量对应的符号的物理地址;
所述电子设备就地执行所述第二可就地执行文件。
3.根据权利要求1所述的方法,其特征在于,
所述电子设备上系统函数和系统变量对应的符号的物理地址是对所述第一应用程序开放的系统函数和系统变量;
所述电子设备在提前编译所述第一文件前,还包括:
所述电子设备基于所述第一应用程序的应用程序包名或应用程序ID或应用程序类型确定第一导出符号表。
4.根据权利要求1至3中任一项所述的方法,其特征在于,所述电子设备在所述提前编译所述第一文件时根据第一导出符号表进行第一程序的外部符号的重定位,具体包括:
所述电子设备在所述提前编译所述第一文件时确定所述第一程序的外部符号与所述第一导出符号表的表项之间的映射关系;
所述电子设备根据所述映射关系进行第一程序的外部符号的重定位。
5.根据权利要求1至4中任一所述的方法,其特征在于,所述电子设备在所述提前编译所述第一文件前,还包括:
所述电子设备确定所述第一导出符号表的基址。
6.根据权利要求1至4中任一项所述的方法,其特征在于,所述电子设备在所述提前编译所述第一文件前,还包括:
所述电子设备将所述第一导出符号表存储在本地的寄存器中。
7.根据权利要求1至4中任一项所述的方法,其特征在于,所述电子设备在所述提前编译所述第一文件前,还包括:
所述电子设备将所述导出符号表保存为配置文件。
8.根据权利要求1至5中任一项所述的方法,其特征在于,所述电子设备在所述提前编译所述第一文件前,还包括:
所述电子设备在运行时Runtime中的结构体中增加第一参数,所述第一参数用于向编译器传递所述第一导出符号表。
9.根据权利要求8所述的方法,其特征在于,所述结构体包括WASMExecEnv。
10.根据权利要求1至9所述的方法,其特征在于,所述运行时Runtime包括WebAssemblyMicro Runtime。
11.根据权利要求1至10所述的方法,其特征在于,所述电子设备提前编译所述第一文件得到第一可就地执行文件后,还包括:
所述电子设备将所述第一可就地执行文件的代码段保存到ROM/flash memory中。
12.一种电子设备,其特征在于,所述电子设备包括:一个或多个处理器和存储器;
所述存储器与所述一个或多个处理器耦合,所述存储器用于存储计算机程序代码,所述计算机程序代码包括计算机指令,所述一个或多个处理器调用所述计算机指令以使得所述电子设备执行如权利要求1至11中任一项所述的方法。
13.一种芯片系统,所述芯片系统应用于电子设备,所述芯片系统包括一个或多个处理器,所述处理器用于调用计算机指令以使得所述电子设备执行如权利要求1至11中任一项所述的方法。
14.一种计算机可读存储介质,包括指令,其特征在于,当所述指令在电子设备上运行时,使得所述电子设备执行如权利要求1至11中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110745174.0A CN115543332A (zh) | 2021-06-30 | 2021-06-30 | 编译时提前链接的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110745174.0A CN115543332A (zh) | 2021-06-30 | 2021-06-30 | 编译时提前链接的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115543332A true CN115543332A (zh) | 2022-12-30 |
Family
ID=84722872
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110745174.0A Pending CN115543332A (zh) | 2021-06-30 | 2021-06-30 | 编译时提前链接的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115543332A (zh) |
-
2021
- 2021-06-30 CN CN202110745174.0A patent/CN115543332A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111552539B (zh) | 变量句柄 | |
US8732732B2 (en) | Type inference and type-directed late binding | |
US10104090B2 (en) | Restrictive access control for modular reflection | |
CN107924326B (zh) | 对经更新的类型的迁移方法进行覆盖 | |
US20160232017A1 (en) | System and Method for Reloading Constructors | |
US7412710B2 (en) | System, method, and medium for efficiently obtaining the addresses of thread-local variables | |
US10789047B2 (en) | Returning a runtime type loaded from an archive in a module system | |
KR20020085872A (ko) | 객체지향 컴퓨터 프로그램의 번역 및 실행방법 | |
US11687388B2 (en) | Implementing optional specialization when executing code | |
US11048489B2 (en) | Metadata application constraints within a module system based on modular encapsulation | |
US20120023307A1 (en) | Methods, systems, and computer program products for excluding an addressable entity from a translation of source code | |
US20120023488A1 (en) | Methods, systems, and computer program products for processing an excludable addressable entity | |
CN115543332A (zh) | 编译时提前链接的方法 | |
CN115543331A (zh) | 虚拟线性内存的硬件、软件协同扩展方法及电子设备 | |
US11803487B2 (en) | Transitioning between thread-confined memory segment views and shared memory segment views | |
US11543976B2 (en) | Methods for reducing unsafe memory access when interacting with native libraries | |
US20200241857A1 (en) | Methods, systems, and computer program products for processing an excludable addressable entity | |
KR20120114926A (ko) | 바이너리 실행파일 생성을 위한 프로그래밍 방법 | |
CN116909652A (zh) | 一种启动WebAssembly程序的方法、计算机设备及存储介质 | |
CN114253523A (zh) | 读取裸设备的方法、装置、计算机设备和介质 | |
US20160266879A1 (en) | Methods, systems, and computer program products for processing an excludable addressable entity | |
Trudel | Java sourcecode to eiffel sourcecode compiler | |
WO2017034652A1 (en) | Restrictive access control for modular reflection |
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 |