CN101697131B - 一种可重定位文件动态加载的方法及装置 - Google Patents
一种可重定位文件动态加载的方法及装置 Download PDFInfo
- Publication number
- CN101697131B CN101697131B CN2009102106230A CN200910210623A CN101697131B CN 101697131 B CN101697131 B CN 101697131B CN 2009102106230 A CN2009102106230 A CN 2009102106230A CN 200910210623 A CN200910210623 A CN 200910210623A CN 101697131 B CN101697131 B CN 101697131B
- Authority
- CN
- China
- Prior art keywords
- reorientation
- address
- code segment
- jump
- joint
- 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/54—Link editing before load time
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开一种可重定位文件动态加载的方法,包括:解析可重定位文件获取信息,并在找到重定位节区后获取重定位目的地址、计算待重定位的地址及跳转距离;判断跳转距离是否超出短跳转范围,如果未超出短跳转范围,则将所述重定位目的地址填入待重定位的地址,进行重定位加载;如果超出短跳转范围,则添加veneer代码段,将超出短跳转范围的跳转间接跳转到重定位目的地址,进行重定位加载。相应地,本发明提供一种可重定位动态加载的装置,包括解析模块、计算模块、查找模块、判断模块、重定位动态加载模块。因此,本发明能在函数调用距离超出跳转范围时,实现可重定位动态加载。
Description
技术领域
本发明涉及一种嵌入式微内核操作系统,特别是涉及一种可重定位文件动态加载的方法及装置。
背景技术
随着科技的发展,移动电话呈现出个人计算机(PC)化的发展驱势,其所需的动态应用文件越来越多。移动电话一般分为智能移动电话(smart phone)和非智能移动电话(feather phone),智能移动电话如wince、ulinux等操作系统基本都实现了动态加载技术,类似于PC上可动态加载应用的Windows操作系统的动态链接库、或Linux操作系统的动态共享文件;而feather phone多数基于嵌入式微内核操作系统开发的,大部分嵌入式操作系统尚未实现动态加载技术。
然而,目前feather phone的市场占有率仍很高,feather phone的应用开发方式通常有两种:一种使用JAVA语言进行开发,另一种静态链接到版本之中。其中,JAVA是一种解释性语言,执行速度慢,同时还需要JAVA虚拟机的支持;而对于通过传统的应用与移动电话版本进行静态链接,以编译生成可执行文件来讲,文件越大需求的硬件资源,如随机存取存储器(RAM)或者非易失性或非闪存(NOR FLASH)的容量就越大,且由于在调试过程中,经常会修改代码,每次修改都要对整个移动电话版本进行重新链接、烧录、加载操作,因此,修改代码所花费的时间甚至比调试代码的时间还多,严重影响了应用开发调试的效率。此外,当代码直接运行于具有NOR FLASH的移动电话时,因烧录时间较长而使得上述现象更为严重,应用开发调试的效率尤为低。同时,电信运营商还有动态升级应用的要求,而静态链接的应用却无法进行动态升级。
目前,在微内核操作系统中实现了动态链接技术,这使得软件开发效率得以提高,按需加载以节省硬件资源,还可以随时为移动电话增加新功能。其中,动态加载过程主要包括计算并分配加载代码所需内存、符号解析、代码重定位三个过程。然而,现有技术在重定位过程中,当函数调用者与被调用者地址距离太远而超出跳转范围时,会造成动态加载失败、或动态加载动态应用文件运行发生错误。
发明内容
有鉴于此,本发明的主要目的在于提供一种可重定位文件动态加载的方法及装置,能在函数调用距离超出跳转范围时,实现可重定位动态加载。
为达到上述目的,本发明公开了一种可重定位文件动态加载的方法,包括:解析可重定位文件获取信息,并在找到重定位节区后获取重定位目的地址,计算待重定位的地址及跳转距离;判断所述跳转距离是否超出短跳转范围,如果未超出短跳转范围,则将所述重定位目的地址填入待重定位的地址,进行重定位加载;如果超出短跳转范围,则生成veneer代码段,并将长跳转指令和重定位目的地址分别填充到veneer代码段中;将veneer代码段的起始地址填入待重定位的地址,形成一个有效的短跳转,所述有效的短跳转指令指向veneer代码段;通过有效的短跳转跳到veneer代码段,再通过veneer代码段的长跳转跳转到重定位目的地址,进行重定位加载;所述veneer代码段为实现ARM状态到thumb状态转换、以及长距离跳转的代码段。
其中,所述解析可重定位文件之前,该方法还包括:生成系统符号表;按照可重定位文件的节区的属性,重组所述可重定位文件,计算加载动态应用文件的代码所需内存空间,并为加载代码分配内存空间以及计算出各代码段的起始地址,读取可重定位文件的节区内容并对应写入所分配的节区的内存空间;其中,所述重组可重定位文件为:将可重定位文件所属文本TEXT、数据DATA、未初始化数据段BSS三段的节区按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列。
上述方法中,所述获取重定位目的地址为:解析可重定位文件获取符号节区的节区头,根据该节区头的sh_type字段对节区头表进行遍历,来查找可重定位文件的符号节区;根据所述符号节区的符号项的st_shndx字段,判断可重定位文件的符号是否为未定义符号;当可重定位文件的符号为未定义符号时,查找所述系统符号表获得未定义符号的符号地址,将该未定义符号的符号地址作为动态应用文件的符号地址;所述动态应用文件引用的外部符号地址为重定位目的地址。
上述方法中,所述计算待重定位的地址为:根据重定位信息,获取重定位的位置在所属节区的偏移;将获取的偏移加上所属节区的起始地址,得到待重定位的地址。
其中,所述查找到重定位节区之后,该方法还包括:判断是否遍历完重定位项,如果没有遍历完重定位项,则获取重定位目的地址;如果遍历完重定位项,则判断是否遍历完节区头表,如果未遍历完节区头表,则继续查找是否存在重定位节区;如果遍历完节区头表,则结束本次可重定位的动态加载过程。
为实现上述方法,本发明提供一种可重定位文件动态加载的装置,包括:解析模块,用于解析可重定位文件获取信息;查找模块,用于根据所述解析模块解析得到的信息查找到重定位节区、获取重定位目的地址;计算模块,用于计算待重定位的地址及跳转距离;判断模块,用于在判断结果为未超出短跳转范围时,将重定位目的地址填入待重定位的地址,进行重定位加载;在判断结果为超出短跳转范围时,生成veneer代码段,并将长跳转指令和重定位目的地址分别填充到veneer代码段中;将veneer代码段的起始地址填入待重定位的地址,形成一个有效的短跳转,所述有效的短跳转指令指向veneer代码段;通过有效的短跳转跳到veneer代码段,再通过veneer代码段的长跳转跳转到重定位目的地址,进行重定位加载;所述veneer代码段为实现ARM状态到thumb状态转换、以及长距离跳转的代码段。
其中,该装置还包括:重组模块,用于将可重定位文件所属的TEXT、DATA、BSS三段的节区按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列;内存划分模块,用于计算并划分加载动态应用文件的代码所需内存空间,并读取可重定位文件的节区内容并对应写入到该节区的内存空间;所述计算模块,还用于计算出各代码段和各节区的起始地址。该装置还包括:第一遍历模块,用于遍历节区头表,并在遍历完成时通知所述查找模块;第二遍历模块,用于遍历重定位项,并在遍历到重定位项时通知所述计算模块;在未遍历到重定位项时通知第一遍历模块;所述查找模块,还用于在查找到重定位节区时通知第二遍历模块。
其中,所述重定位动态加载模块包括:添加单元,用于在判断结果为超出短跳转范围时,生成veneer代码段;转换单元,用于将长跳转指令和重定位目的地址分别填充到veneer代码段中;将veneer代码段的起始地址填入待重定位的地址,形成一个有效的短跳转,所述有效的短跳转指令指向veneer代码段;通过有效的短跳转跳到veneer代码段,再通过veneer代码段的长跳转跳转到重定位目的地址,进行重定位加载。
由以上技术方案可以看出,本发明提供的可重定位动态加载的方法,解决了动态加重定位过程中,函数调用者与被调用者地址距离太远,超出短跳转范围,造成动态加载失败的问题。换句话说就是,在进行可重定位动态加载时,本发明将超出跳转范围的短跳转转换成一个有效的短跳转和一个长跳转指令,从而实现了在函数调用距离超出跳转范围时的可重定位动态加载。
另外,本发明采用应用与移动电话平台独立开发的方式,使得在需要对动态应用文件进行修改时,单独编译需要修改的动态应用文件即可,而无需对平台版本进行重新制作、烧录、加载等操作,如此,节省了大量的时间,可集中精力调试应用本身,极大的提高了应用开发效率。
本发明将应用与移动电话平台由原来在PC侧进行链接改为在移动电话中进行链接,非常便于对移动电话平台功能进行扩展,如更新动态应用文件。并且,在运行时通过对已有的动态应用文件进行升级,能满足多方面的需求,如:更新/下载最新的动态应用文件。
综上所述,本发明可重定位动态加载的方法及装置,不仅能够提高软件开发效率,按需加载节省硬件资源,满足电信运营商的要求;还可以随时为移动电话增加新功能。尤其是,能够通过在跳转距离超出范围时,将超出范围的短跳转转换成一个有效的短跳转和一个长跳转,实现可重定位动态加载。
附图说明
图1为本发明可重定位文件动态加载的方法的实现流程示意图;
图2为本发明代码重定位的流程示意图;
图3为本发明可重定位文件动态加载的装置的组成示意图。
具体实施方式
本发明的基本思想在于:将超出跳转范围的短跳转转换成一个有效的短跳转和一个长跳转,实现在函数调用距离超出跳转范围时的可重定位动态加载。
需要说明的是,本发明所采用的嵌入式设备大部分使用ARM处理器,动态加载的可重定位文件使用可执行链接格式(ELF,Executable and Linking Format)的链接视图,且在调试运行时采用的ELF格式的软件。其中,所述可重定位文件为PC侧的ARMCC编译器编译生成的目标文件,包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。所述可重定位文件具有多种格式如Windows的可移植的执行体(PE,Portable Excutable)格式、Unix/Linux的ELF。
这里,根据ARM即Advanced RISC Machine结构体系可知,ARM链接器在链接过程中提供一些小代码段,用于实现ARM状态到thumb状态转换、以及长距离跳转,通常将这些小代码段称之为状态切换代码(veneer)。由于不同的编译器生成的可重位目标文件会有所不同,也就是说,veneer代码与编译器相关,比如:GNU编译器套装(GCC,GNU Compiler Collection)编译器具有-mlong选项,可以直接将跳转指令编译成长跳转。而低版本的ARMCC编译器不具有类似的属性,生成的可重定位文件都是短跳转指令,跳转范围在+32M~-32M内,只能在ARMLINK链接器链接过程中根据需要将跳转转化成长跳转。
动态加载文件的内存地址通常是在移动电话系统堆内存中进行分配,使用ARMCC编译器生成的可重定位文件,但是,当加载重定位目的地址与系统代码的地址距离太远,重定位过程中就可能出现函数调用者与被调者距离超出短跳转的范围,这样重定位就会失败。因此,在重定位过程中,需要将超出跳转范围的短跳转转换成长跳转指令,即生成veneer代码段,其中veneer代码段的作用是实现长距离跳转。根据ARM结构体系可知,长跳转可以通过直接向PC寄存器赋值来实现,但直接将短跳转指令改换成使用立即数即符号的地址,对PC赋值指令会带来一个问题:每个立即数由一个八位常数循环右移偶数位得到,并不是每一个32位常数都是合法的立即数。那么,需要采用一种间接方法,将超出范围的短跳转转换成一个有效的短跳转和一个长跳转。因此,本发明采用veneer代码实现该长跳转,其中veneer代码占用两条汇编指令即八个字节,前四个字节存放长跳转指令,后四个字节存放动态应用文件引用的外部符号地址即重定位目的地址。如此,在重定位超出短跳转距离范围的外部符号时,通过有效的短跳转跳转到veneer代码,借助veneer代码段的长跳转指令,跳转到动态应用文件引用的外部符号地址,来实现动态加载。其中,所述有效的短跳转是指未超出短跳转范围的跳转。
为使本发明上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施例对本发明作进一步详细的说明。
本发明可重定位动态加载的实现,相当于在移动电话的嵌入式微内核操作系统中提供一个简化的加载链接器,使得动态应用文件的开发方式、函数调用关系与静态应用的基本一致,且无需改动所述动态应用文件。这里,本发明可重定位文件动态加载的方法如图1所示,主要包括如下步骤:
步骤101,生成系统符号表;
其中,所述系统符号表主要组成部分包括:符号名称和符号地址,系统符号表由移动电话平台(以下简称平台)生成,其生成过程包括:将静态版本对外提供的符号名称及符号地址绑定在一起,组成静态数组;在移动电话系统初始化时,将该静态数组按哈希表的方式组织起来,供动态加载动态应用文件时进行查询。
其中,该静态数组的生成可由数组生成工具通过二次编译生成,即:第一次编译时,将该静态数组设为空,并将平台版本编译链接生成带符号信息的可执行文件,扫描该可执行文件获取符号名称,进而生成该静态数组;在进行二次编译时,通过编程语法得到符号地址,由编译器将符号地址填入所述静态数组;然后,在移动电话系统初始化时,将静态数组以哈希表的形式存储,以便于后续进行符号查找。
步骤102,解析可重定位文件并进行重组,计算加载动态应用文件的代码所需内存空间;
本步骤中,可重定位动态加载的装置根据节区头的sh_type等字段解析可重定位文件,遵守ELF文件格式。抽取解析得到的运行、重定位等信息读入内存,按照可重定位文件的节区的属性等信息进行重新组合,并计算加载动态应用文件的代码所需内存空间。
需要说明的是,可执行文件如动态应用文件由文本(TEXT)、数据(DATA)、未初始化数据段(BSS,Block Started by Symbol)三段组成,其中,TEXT段用于放置编译时确定的动态应用文件代码,为只读格式;DATA段用于存放在编译阶段就能确定的数据,可读可写,DATA段是通常所说的静态存储区,赋了初值的全局变量和静态变量存放在这个区域,常量也存放在这个区域;BSS段是定义而没有赋初值的全局变量和静态变量。
主要的重组过程为:所述可重定位文件采用ELF的链接视图,于是先根据可重定位文件的节区头表的sh_type及sh_flag两字段确定所属段类型,再将TEXT段、DATA段及BSS段内的节区头表按一定顺序如按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列,即若节区名称相同,则再按节区序号进行升序排列。然后,根据节区头表的节区对齐约束sh_addralign字段及节区大小sh_size字段,分别计算出各代码段所需内存大小及总内存大小。其中,所述节区头表由ELF文件格式决定,包括很多节区头,是从可重定位文件复制到内存中的,在重定位结束后才被释放。
需要指出的是,由于不同的链接器或不同的链接器版本串联的方式也会有所不同,于是为了方便调试动态应用文件以及不影响动态应用文件的运行,需要使TEXT段、DATA段及BSS段内的节区排序方式与PC侧链接器串联的方式保持一致。这里,将TEXT段内节区头表按一定顺序串联起来,主要是为了与PC侧链接器生成的顺序一致,而PC侧链接器对DATA段及BSS段是按节区序号进行排序的。
步骤103,为加载代码分配所需的内存空间并计算出各代码段的起始地址,读取可重定位文件的节区内容并对应写入所分配的节区的内存空间;
这里,可重定位动态加载的装置计算得到加载代码所需的内存空间后,为加载代码分配所需的内存空间,并根据每个节区的大小、排序及地址等信息计算出各代码段及各节区的起始地址。根据节区头表的sh_offset字段及sh_size字段,将属于TEXT、DATA、BSS三段的节区内容从可重定位文件直接读取到该节区的内存空间。
步骤104,解析可重定位文件获取信息,查找动态应用文件引用的外部符号地址;
这里,所述信息包括:字符串信息、符号信息、节区信息、重定位信息,其中,该重定位信息是由ELF文件格式确定的,所述动态应用文件引用的外部符号地址为重定位目的地址。
ELF文件规定,目前可重定位文件除了所具有的普通节区外,只含有一个符号节区,通过该符号节区可查找到该重定位文件的符号,该符号为动态应用文件使用的函数或者变量。具体地,解析可重定位文件获取符号节区头,根据节区头的sh_type字段对节区头表进行遍历,来查找可重定位文件的符号节区;该符号节区头的sh_link字段则表明符号对应的字符串节区索引,该字符串索引用于在字符串节区中定位符号名称,通过所述字符串节区索引,可在节区头表中找到对应的字符串节区在文件中的位置,然后将该字符串节区拷入内存,重定位过程中会使用到该字符串节区,使用完该字符串节区后将其释放删除。而符号节区是由很多符号项组成的,其中,该符号项的st_shndx字段则表明符号定义所在的节区,通过该st_shndx字段还可以判断所述符号是未定义的还是已定义的:
1)对于已定义符号,则根据符号定义所在的节区起始地址和符号项的st_value字段,获取符号地址并将符号信息添加到动态应用文件的哈希符号表即动态应用文件符号表中,供后续对动态应用文件的函数调用。其中,所述符号信息是在动态加载过程中组织起来的,包括符号名称及符号地址。例如:需要调用动态应用文件对外提供的接口时,可以通过函数名即符号名称查找所述动态应用文件符号表,获取动态应用文件的函数地址。此处,所述已定义符号分为本地符号和全局符号,二者可根据符号项的st_info字段进行区别。并且,加载时可以只将全局符号加入所述动态应用文件符号表中,因为本地符号对动态应用文件的加载、运行及调试的影响较小。
2)对于未定义符号,则通过查找系统符号表,获得未定义符号的符号地址。该未定义符号为动态应用文件引用的外部符号。这里,未定义符号是重定位的关键,如果找不到未定义的符号,则可重定位文件加载应为失败,即使仍继续加载成功,动态应用文件也不能确保正确运行。
3)根据符号项的个数,在内存中建立起一个符号数组,将符号索引与计算或查找得到的符号地址、符号类型绑定在一起,符号索引与数组下标一一对应,供后续重定位时使用。重定位项r_info字段的高24位即r_info>>8表示重定位项对应的符号在符号节区的索引,通过该索引查找该符号数组即可找到符号的绝对地址。该符号数组在重定位结束后才被释放。符号数组是符号节区在内存中的表现形式。
步骤105,查找重定位节区,并根据查找到的重定位节区的重定位信息,计算待重定位的地址及跳转距离;
其中,待重定位地址给出了重定位动作所适用的绝对地址,重定位则是将符号引用与符号定义进行连接的过程。
步骤106,判断所述跳转距离是否超出短跳转范围,如果未超出短跳转范围,则执行步骤107;如果超出短跳转范围,则执行步骤108;
步骤107,将动态应用文件引用的外部符号地址填入待重定位的地址,进行重定位动态加载;
在动态加载过程中,代码重定位是将符号引用与符号地址进行链接的过程,例如:当程序调用了一个函数时,相关的调用指令必须把控制传输到适当的目标执行地址。在系统符号表中查找到的未定义符号的符号地址后,将所述未定义符号的符号地址填入待重定位的地址。其中,该未定义符号即动态应用文件引用的外部符号的绝对地址,也是进行重定位的目的地址。
步骤108,添加veneer代码段,将超出范围的短跳转转换成一个有效的短跳转和一个长跳转,通过有效的短跳转跳转到veneer代码段上,借助veneer代码段的长跳转指令跳转到所引用的外部符号地址,进行重定位动态加载。
在重定位过程中,若出现超出范围的短跳转,则需要将超出范围的短跳转转换成一个有效的短跳转指令和一个长跳转指令,即:生成veneer代码段,该veneer代码段占用两条汇编指令即八个字节,前四个字节存放长跳转指令,后四个字节存放真正的重定位目的地址即动态应用文件引用的外部符号的绝对地址。如此,可使有效的短跳转指令指向veneer代码段,并通过veneer代码段的长跳转指令跳转到目的地址,实现长距离跳转,从而实现动态加载。其中,重定位过程包括以下两种方案:
I、对节区头表进行两次遍历:第一次累计超出短跳转范围的次数,进而分配所有veneer代码段所需空间;第二次则进行重定位,将超出短跳转范围的短跳转重定位到对应的veneer代码段的长跳转指令所在地址,并填充veneer代码段。
II、对节区头表进行一次遍历,此时不再精确统计超出短跳转范围的次数,而是根据动态应用文件引用的外部符号数为veneer代码段分配较大的空间,并将超出短跳转范围的短跳转重定位到对应的veneer代码段的长跳转指令所在地址,并填充veneer代码段。
其中,veneer代码段不仅适用于长距离跳转,还适用于ARM状态与thumb状态之间的切换。应用于ARM状态与thumb状态之间切换时,所需要的代码段空间不变,代码段内容有所不同。
相对于重定位方案I而言,重定位方案II则是一种更加优化,这是因为:方案I需要两次遍历节区头表,所需要时间更多。此外,因为只要引用相同的符号,生成的veneer代码段就是相同的,所以方案II将相同的veneer代码段合并,而方案I没有将相同的veneer代码段合并,同一个符号可能会被多次引用,重复的veneer代码段很多。因此,相对于方案II而言,方案I所使用的空间更多。
下面结合图2,对重定位方案II给出的代码重定位过程作进一步描述,其主要包括以下步骤:
步骤201,判断是否遍历完可重定位文件的节区头表,如果没有遍历完毕,则执行步骤202;如果遍历完毕,则执行步骤209;
其中,遍历可重定位文件的节区头表中的所有项,来查找重定位节区。这里,所述重定位节区是指可重定位文件中的节区的属性为可重定位的普通节区。其中,所述重定位节区只对应一个代码节区,由多个重定位项组成,用于保存修改其他节区内容的信息,即提供如何对代码节区进行修改的信息。
步骤202,判断所遍历的节区是否为重定位节区,若不是重定位节区,则返回执行步骤201;若是重定位节区,则执行步骤203;
可重定位动态加载的装置根据节区头的sh_type字段,遍历节区头表可以查找到重定位节区。其中,重定位节区会引用两个其它节区:符号节区、要修改的节区,重定位节区头的sh_info字段和sh_link字段成员给出进行重定位的数据关系,重定位节区头的sh_info字段表明适用的节区索引,sh_link字段表明对应的符号节区索引。由于目前ELF文件格式规定,一个ELF文件只有一个符号节区,因此sh_link字段可以不予使用。
步骤203,判断是否遍历完重定位项,如果遍历完毕,则返回执行步骤201;如果没有遍历完毕,则执行步骤204;
根据可重定位节区中的重定位项的个数,来判断是否遍历完重定位项。其中,可重定位节区中的重定位项的个数是根据重定位节区头中记录的重定位节区的大小、重定位项的大小来计算得到的,即:
重定位项的个数=重定位节区的大小/重定位项的大小
其具体的计算方法可参见ELF文件格式的相关规定。这里,重定位项为可重定位文件所包含的如何修改其节区内容的信息,从而允许可执行文件和共享目标文件保存进程的程序映像的正确信息。
步骤204,读取重定位信息,计算待重定位的地址;
所述重定位项重定位表项描述如何修改后面的指令和数据字段,包括r_offset字段、r_info字段等成员。其中,r_offset字段给出了重定位动作所适用的位置,给出受影响的存储单位的第一个字节的偏移。对于一个可重定位文件而言,r_offset的取值是从节区头部开始到将被重定位影响的存储单位之间的字节偏移。对于可执行文件或者共享目标文件而言,其取值是被重定位影响到的存储单元的虚拟地址。而r_info字段给出要进行重定位的符号表索引,以及将实施的重定位类型。例如,一个调用指令的重定位项将包含被调用函数的符号表索引。
本实施例中,根据重定位信息,获取重定位的位置在所属节区的偏移。重定位项的r_offset字段表明重定位的位置在所属节区的偏移,该偏移加上所属节区的起始地址,可定位到待重定位的地址。其中,所属节区为待重定位的节区。
这里,重定位项的r_info字段具有两个含义,占四个字节。其中,该r_info字段的低8位即(unsigned char)r_info表示重定位项的类型,不同的重定位项的类型有不同的重定位规则,具体请参照ELF格式的相关规则。r_info字段的高24位即r_info>>8则表示重定位项对应的符号在符号节区的索引,通过该符号节区的索引可找到符号的绝对地址。该绝对地址为相对于0的地址,通过地址跳转来实现函数调用。
步骤205,根据重定位项的类型,按照不同的规则,计算跳转距离;
所述重定位类型给出了需要修改以及如何计算修改取值的方法,其中,所述重定位项的类型以及计算跳转距离的过程,请参照ELF文件格式的相关规定,此处不再赘述。
步骤206,判断跳转距离是否超出短跳转范围,如果超出短跳转范围,则执行步骤207;如果未超出短跳转范围,则执行步骤208;
本实施例中,所述短跳转范围为+32M~-32M。
步骤207,添加veneer代码段,间接跳转到重定位目的地址,然后返回步骤203;
其中,veneer代码空间根据外部引用符号数,通过一次性分配如采用伪代码:pc,=pSymAdrs;dcd pSymAdrs等来添加veneer代码段,将veneer代码段的起始地址填入所述待重定位的地址,形成一个有效的短跳转,并将长跳转指令和引用的外部符号绝对地址分别填充到veneer代码段中。这样,有效的短跳转指令指向veneer代码段,通过veneer代码段的长跳转指令,进而间接跳转到所引用的外部符号地址,即重定位目的地址。其中,所述外部引用符号数可在判断是已定义符号还是未定义符号时进行累加,该未定义符号即为引用的外部符号。
需要指出的是,为节省空间,本步骤也可先寻找是否存在已生成的veneer代码段,如果存在,则不必再生成veneer代码段,直接将该veneer代码段起始地址填入待重定位的地址即可。
步骤208,直接修改代码段指令进行重定位,然后返回步骤203;
其中,所述代码段指令为:指重定位目的地址所容纳的指令。在跳转距离未超出跳转范围时,直接将修改代码段指令是指:将引用的外部符号地址填入待重定位的地址。具体的填入方式参照ELF文件格式的规定。
步骤209,结束本次代码重定位流程。
对于上述各实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。
为实现上述方法,本发明还提供一种可重定位文件动态加载的装置,如图3所示,包括:解析模块、计算模块、查找模块、判断模块、重定位动态加载模块;其中,
解析模块,用于解析可重定位文件获取信息;
查找模块,用于根据所述解析模块解析得到的信息查找重定位节区、获取重定位目的地址;
计算模块,用于计算待重定位的地址及跳转距离;
判断模块,用于判断跳转距离是否超出短跳转范围,并将判断结果通知给重定位动态加载模块;
重定位动态加载模块,用于将重定位目的地址填入待重定位的地址,以及用于添加veneer代码段;将超出短跳转范围的短跳转转换成一个有效的短跳转和一个长跳转,通过有效的短跳转到veneer代码段,借助veneer代码段的长跳转指令跳转到重定位目的地址,并进行重定位动态加载。
上述装置还包括:重组模块、内存划分模块;其中,
重组模块,用于将可重定位文件所属的TEXT、DATA、BSS三段的节区按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列;
内存划分模块,用于计算并划分加载动态应用文件的代码所需内存空间,并读取可重定位文件的节区内容并对应写入到该节区的内存空间;
相应的,所述计算模块,还用于计算出各代码段和各节区的起始地址。
该装置还包括:第一遍历模块、第二遍历模块;其中,
第一遍历模块,用于遍历节区头表,并在遍历完成时通知所述查找模块;
第二遍历模块,用于遍历重定位项,并在遍历到重定位项时通知所述计算模块;在未遍历到重定位项时通知第一遍历模块。
相应的,所述查找模块,还用于在查找到重定位节区时通知第二遍历模块。
其中,所述重定位动态加载模块包括:添加单元,用于添加veneer代码;转换单元,用于将超出范围的短跳转转换成一个有效的短跳转和一个长跳转,通过有效的短跳转到veneer代码段,借助veneer代码段的长跳转指令,跳转到引用的外部符号地址。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述即可。以上所述,仅为本发明的较佳实施例而已,只是用来说明和解释本发明,并非用于限定本发明的保护范围。在本发明的精神和权利要求保护范围之内,对本发明所作的任何修改、等同替换,都落入本发明的保护范围。
Claims (9)
1.一种可重定位文件动态加载的方法,其特征在于,包括:
解析可重定位文件获取信息,并在找到重定位节区后获取重定位目的地址,计算待重定位的地址及跳转距离;
判断所述跳转距离是否超出短跳转范围,如果未超出短跳转范围,则将所述重定位目的地址填入待重定位的地址,进行重定位加载;
如果超出短跳转范围,则生成veneer代码段,并将长跳转指令和重定位目的地址分别填充到veneer代码段中;将veneer代码段的起始地址填入待重定位的地址,形成一个有效的短跳转,所述有效的短跳转指令指向veneer代码段;通过有效的短跳转跳到veneer代码段,再通过veneer代码段的长跳转跳转到重定位目的地址,进行重定位加载;
所述veneer代码段为实现ARM状态到thumb状态转换、以及长距离跳转的代码段。
2.根据权利要求1所述的可重定位文件动态加载的方法,其特征在于,所述解析可重定位文件之前,该方法还包括:
生成系统符号表;
按照可重定位文件的节区的属性,重组所述可重定位文件,计算加载动态应用文件的代码所需内存空间,并为加载代码分配内存空间以及计算出各代码段的起始地址,读取可重定位文件的节区内容并对应写入所分配的节区的内存空间;
其中,所述重组可重定位文件为:将可重定位文件所属文本TEXT、数据DATA、未初始化数据段BSS三段的节区按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列。
3.根据权利要求2所述的可重定位文件动态加载的方法,其特征在于,所述获取重定位目的地址为:
解析可重定位文件获取符号节区的节区头,根据该节区头的sh_type字段对节区头表进行遍历,来查找可重定位文件的符号节区;
根据所述符号节区的符号项的st_shndx字段,判断可重定位文件的符号是否为未定义符号;
当可重定位文件的符号为未定义符号时,查找所述系统符号表获得未定义符号的符号地址,将该未定义符号的符号地址作为动态应用文件的符号地址;所述动态应用文件引用的外部符号地址为重定位目的地址。
4.根据权利要求1至3中任一项所述的可重定位文件动态加载的方法,其特征在于,所述计算待重定位的地址为:
根据重定位信息,获取重定位的位置在所属节区的偏移;将获取的偏移加上所属节区的起始地址,得到待重定位的地址。
5.根据权利要求1所述的可重定位文件动态加载的方法,其特征在于,所述查找到重定位节区之后,该方法还包括:
判断是否遍历完重定位项,如果没有遍历完重定位项,则获取重定位目的地址;
如果遍历完重定位项,则判断是否遍历完节区头表,如果未遍历完节区头表,则继续查找是否存在重定位节区;如果遍历完节区头表,则结束本次可重定位的动态加载过程。
6.一种可重定位文件动态加载的装置,其特征在于,包括:
解析模块,用于解析可重定位文件获取信息;
查找模块,用于根据所述解析模块解析得到的信息查找到重定位节区、获取重定位目的地址;
计算模块,用于计算待重定位的地址及跳转距离;
判断模块,用于判断跳转距离是否超出短跳转范围,并将判断结果通知给重定位动态加载模块;
重定位动态加载模块,用于在判断结果为未超出短跳转范围时,将重定位目的地址填入待重定位的地址,进行重定位加载;在判断结果为超出短跳转范围时,生成veneer代码段,并将长跳转指令和重定位目的地址分别填充到veneer代码段中;将veneer代码段的起始地址填入待重定位的地址,形成一个有效的短跳转,所述有效的短跳转指令指向veneer代码段;通过有效的短跳转跳到veneer代码段,再通过veneer代码段的长跳转跳转到重定位目的地址,进行重定位加载;所述veneer代码段为实现ARM状态到thumb状态转换、以及长距离跳转的代码段。
7.根据权利要求6所述的可重定位文件动态加载的装置,其特征在于,该装置还包括:
重组模块,用于将可重定位文件所属的TEXT、DATA、BSS三段的节区按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列;
内存划分模块,用于计算并划分加载动态应用文件的代码所需内存空间,并读取可重定位文件的节区内容并对应写入到该节区的内存空间;
所述计算模块,还用于计算出各代码段和各节区的起始地址。
8.根据权利要求6或7所述的可重定位文件动态加载的装置,其特征在于,该装置还包括:
第一遍历模块,用于遍历节区头表,并在遍历完成时通知所述查找模块;
第二遍历模块,用于遍历重定位项,并在遍历到重定位项时通知所述计算模块;在未遍历到重定位项时通知第一遍历模块;
所述查找模块,还用于在查找到重定位节区时通知第二遍历模块。
9.根据权利要求6或7所述的可重定位文件动态加载的装置,其特征在于,所述重定位动态加载模块包括:
添加单元,用于在判断结果为超出短跳转范围时,生成veneer代码段;
转换单元,用于将长跳转指令和重定位目的地址分别填充到veneer代码段中;将veneer代码段的起始地址填入待重定位的地址,形成一个有效的短跳转,所述有效的短跳转指令指向veneer代码段;通过有效的短跳转跳到veneer代码段,再通过veneer代码段的长跳转跳转到重定位目的地址,进行重定位加载。
Priority Applications (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009102106230A CN101697131B (zh) | 2009-11-04 | 2009-11-04 | 一种可重定位文件动态加载的方法及装置 |
PCT/CN2010/075368 WO2011054223A1 (zh) | 2009-11-04 | 2010-07-21 | 一种可重定位文件动态加载的方法及装置 |
US13/258,431 US8566372B2 (en) | 2009-11-04 | 2010-07-21 | Method and device for dynamically loading relocatable file |
EP10827837.5A EP2487585B1 (en) | 2009-11-04 | 2010-07-21 | Method and device for dynamically loading relocatable file |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009102106230A CN101697131B (zh) | 2009-11-04 | 2009-11-04 | 一种可重定位文件动态加载的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101697131A CN101697131A (zh) | 2010-04-21 |
CN101697131B true CN101697131B (zh) | 2013-07-03 |
Family
ID=42142236
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009102106230A Active CN101697131B (zh) | 2009-11-04 | 2009-11-04 | 一种可重定位文件动态加载的方法及装置 |
Country Status (4)
Country | Link |
---|---|
US (1) | US8566372B2 (zh) |
EP (1) | EP2487585B1 (zh) |
CN (1) | CN101697131B (zh) |
WO (1) | WO2011054223A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104318135A (zh) * | 2014-10-27 | 2015-01-28 | 中国科学院信息工程研究所 | 一种基于可信执行环境的Java代码安全动态载入方法 |
Families Citing this family (37)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101697131B (zh) | 2009-11-04 | 2013-07-03 | 中兴通讯股份有限公司 | 一种可重定位文件动态加载的方法及装置 |
US8887122B2 (en) * | 2010-11-23 | 2014-11-11 | Red Hat, Inc. | Find and track information of interface usage of software libraries by other software |
US8776036B2 (en) | 2010-11-23 | 2014-07-08 | Red Hat, Inc. | Determining support criteria for shared libraries based on their priority levels |
US8938706B2 (en) | 2010-11-23 | 2015-01-20 | Red Hat, Inc. | Providing customized visualization of application binary interface/application programming interface-related information |
US8863108B2 (en) * | 2010-11-23 | 2014-10-14 | Red Hat, Inc. | Finding out if software will run on an operating system without installing that software |
CN102333036B (zh) * | 2011-10-17 | 2015-06-03 | 中兴通讯股份有限公司 | 一种实现高速路由查找的方法和系统 |
CN102385524B (zh) * | 2011-12-23 | 2014-11-12 | 浙江大学 | 一种基于混编指令集的编译链指令替换方法 |
CN102591687A (zh) * | 2011-12-30 | 2012-07-18 | 广东中钰科技有限公司 | 一种抄表终端切换表计规约的应用系统以及方法 |
CN102831178B (zh) * | 2012-07-30 | 2016-05-25 | 华为技术有限公司 | 多级存储的重部署方法及装置 |
CN103399774A (zh) * | 2013-07-29 | 2013-11-20 | 华为技术有限公司 | 链接方法及链接器及计算机系统 |
CN103631971B (zh) * | 2013-12-20 | 2017-12-08 | 北京奇虎科技有限公司 | 一种可移植的执行体文件的重组方法和装置 |
CN104239064B (zh) * | 2014-09-26 | 2017-09-15 | 福建升腾资讯有限公司 | 一种提取和组织arm程序重定位信息的方法 |
CN104504333B (zh) * | 2014-11-25 | 2018-03-06 | 武汉安天信息技术有限责任公司 | Elf文件中的恶意代码检测方法及装置 |
CN104361120B (zh) * | 2014-12-02 | 2018-06-12 | 国家电网公司 | 一种页面联动方法及系统 |
CN105792348B (zh) * | 2014-12-23 | 2018-12-07 | 中国民用航空总局第二研究所 | 一种无线传感网节点间的节点定位方法 |
CN104809018B (zh) * | 2015-05-18 | 2018-01-02 | 烽火通信科技股份有限公司 | 一种嵌入式系统软件注入热补丁的方法及系统 |
CN106708593B (zh) * | 2015-07-16 | 2020-12-08 | 中兴通讯股份有限公司 | 一种程序链接的编译方法及装置 |
CN106445575B (zh) * | 2015-08-13 | 2019-12-31 | 龙芯中科技术有限公司 | 程序的重写方法和装置 |
CN105224370B (zh) * | 2015-10-21 | 2019-03-08 | 安一恒通(北京)科技有限公司 | 一种加载elf文件的方法和装置 |
CN105426223B (zh) * | 2015-12-25 | 2019-01-04 | 百度在线网络技术(北京)有限公司 | 应用加载方法和装置 |
US10268465B2 (en) * | 2016-10-24 | 2019-04-23 | International Business Machines Corporation | Executing local function call site optimization |
CN106502755B (zh) * | 2016-11-28 | 2021-11-02 | 杭州迪普科技股份有限公司 | 一种检查Linux内核模块未知符号的方法及装置 |
CN106598674A (zh) * | 2016-12-16 | 2017-04-26 | 中南大学 | 一种基于可重定位elf文件的软件快速加载方法 |
US10445007B1 (en) * | 2017-04-19 | 2019-10-15 | Rockwell Collins, Inc. | Multi-core optimized warm-start loading approach |
CN107450960A (zh) * | 2017-09-18 | 2017-12-08 | 珠海亿智电子科技有限公司 | 一种对可执行elf文件重新链接和加载的方法 |
CN109814939B (zh) * | 2017-11-20 | 2021-10-15 | 华为技术有限公司 | 一种动态加载方法、目标文件的制作方法及装置 |
CN108255475A (zh) * | 2017-12-19 | 2018-07-06 | 芯海科技(深圳)股份有限公司 | 一种elf文件格式的扩展应用方法 |
CN108196905B (zh) * | 2017-12-28 | 2019-03-22 | 北京翼辉信息技术有限公司 | 一种基于dsp的动态加载方法 |
US11200070B2 (en) | 2018-08-03 | 2021-12-14 | International Business Machines Corporation | Dynamic-link library usage based on memory size |
CN110895512A (zh) * | 2018-09-13 | 2020-03-20 | 普天信息技术有限公司 | 一种内存管理方法 |
CN110765027B (zh) * | 2019-12-27 | 2020-04-10 | 中国人民解放军国防科技大学 | 一种pe文件地址定位系统 |
CN111352842A (zh) * | 2020-02-28 | 2020-06-30 | 成都金诺信高科技有限公司 | 基于嵌入式的软件调试方法 |
CN111984411A (zh) * | 2020-08-18 | 2020-11-24 | 上海睿赛德电子科技有限公司 | 一种用于资源受限平台的应用重定位方法 |
CN113094119B (zh) * | 2021-04-28 | 2022-07-12 | 杭州国芯科技股份有限公司 | 一种嵌入式设备程序动态加载方法 |
CN113312087A (zh) * | 2021-06-17 | 2021-08-27 | 东南大学 | 一种基于RISC处理器常量池布局分析与整合的Cache优化方法 |
CN113849245B (zh) * | 2021-09-23 | 2023-09-12 | 武汉深之度科技有限公司 | 一种应用程序运行方法、计算设备及存储介质 |
CN115495158B (zh) * | 2022-10-09 | 2023-08-08 | 电子科技大学 | 微内核操作系统中系统服务动态构建方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3038733B2 (ja) * | 1989-10-27 | 2000-05-08 | ソニー株式会社 | 映像信号処理回路 |
CN101004681A (zh) * | 2006-12-22 | 2007-07-25 | 中兴通讯股份有限公司 | 嵌入式系统动态补丁长跳转的实现方法 |
US7293265B2 (en) * | 2003-05-15 | 2007-11-06 | Intel Corporation | Methods and apparatus to perform return-address prediction |
Family Cites Families (23)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5291601A (en) * | 1989-06-01 | 1994-03-01 | Hewlett-Packard Company | Shared libraries implemented with linking program loader |
WO1994022078A2 (en) * | 1993-03-23 | 1994-09-29 | Apple Computer, Inc. | Apparatus and method for a relocatable file format |
US6219830B1 (en) * | 1993-03-23 | 2001-04-17 | Apple Computer, Inc. | Relocatable object code format and method for loading same into a computer system |
JP2757777B2 (ja) * | 1994-05-26 | 1998-05-25 | 住友金属工業株式会社 | メモリの不正アクセス検出方法及びシステム |
US6108759A (en) * | 1995-02-23 | 2000-08-22 | Powerquest Corporation | Manipulation of partitions holding advanced file systems |
US5933642A (en) * | 1995-04-17 | 1999-08-03 | Ricoh Corporation | Compiling system and method for reconfigurable computing |
US6002876A (en) * | 1996-09-27 | 1999-12-14 | Texas Instruments Incorporated | Maintaining code consistency among plural instruction sets via function naming convention |
US7565665B2 (en) * | 1998-09-09 | 2009-07-21 | Microsoft Corporation | Efficient linking and loading for late binding and platform retargeting |
US7409694B2 (en) * | 1998-09-09 | 2008-08-05 | Microsoft Corporation | Highly componentized system architecture with loadable virtual memory manager |
GB2358491A (en) * | 1999-09-03 | 2001-07-25 | Sgs Thomson Microelectronics | A relocation format for linking |
US6708330B1 (en) * | 2000-06-13 | 2004-03-16 | Cisco Technology, Inc. | Performance improvement of critical code execution |
US20020138748A1 (en) * | 2001-03-21 | 2002-09-26 | Hung Andy C. | Code checksums for relocatable code |
EP1280056B1 (en) * | 2001-07-26 | 2011-10-05 | STMicroelectronics Limited | Generation of debugging information |
US7228540B2 (en) * | 2002-05-14 | 2007-06-05 | Microsoft Corporation | Preparation for software on demand system |
US6802606B2 (en) * | 2003-02-04 | 2004-10-12 | Johnson & Johnson Vision Care, Inc. | Multifocal contact lens pairs |
US7587712B2 (en) * | 2003-12-19 | 2009-09-08 | Marvell International Ltd. | End-to-end architecture for mobile client JIT processing on network infrastructure trusted servers |
US20120011367A1 (en) * | 2005-04-21 | 2012-01-12 | Denison William D | Method for Controlling and Recording the Security of an Enclosure |
US20060277541A1 (en) * | 2005-06-07 | 2006-12-07 | Sony Computer Entertainment America Inc. | Relocatable component file format |
US7735075B2 (en) * | 2005-12-01 | 2010-06-08 | Samsung Electronics Co., Ltd. | System and method for a pseudo dynamic link library (DLL) linker for a monolithic image in a wireless device |
US20080163375A1 (en) * | 2006-12-28 | 2008-07-03 | Savagaonkar Uday R | Embedding and patching integrity information in a program file having relocatable file sections |
CN101470619A (zh) * | 2007-12-29 | 2009-07-01 | 安凯(广州)软件技术有限公司 | 一种基于微核操作系统的应用程序动态加载方法 |
US9135144B2 (en) * | 2009-10-22 | 2015-09-15 | Freescale Semiconductor, Inc. | Integrated circuits and methods for debugging |
CN101697131B (zh) | 2009-11-04 | 2013-07-03 | 中兴通讯股份有限公司 | 一种可重定位文件动态加载的方法及装置 |
-
2009
- 2009-11-04 CN CN2009102106230A patent/CN101697131B/zh active Active
-
2010
- 2010-07-21 US US13/258,431 patent/US8566372B2/en active Active
- 2010-07-21 WO PCT/CN2010/075368 patent/WO2011054223A1/zh active Application Filing
- 2010-07-21 EP EP10827837.5A patent/EP2487585B1/en active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3038733B2 (ja) * | 1989-10-27 | 2000-05-08 | ソニー株式会社 | 映像信号処理回路 |
US7293265B2 (en) * | 2003-05-15 | 2007-11-06 | Intel Corporation | Methods and apparatus to perform return-address prediction |
CN101004681A (zh) * | 2006-12-22 | 2007-07-25 | 中兴通讯股份有限公司 | 嵌入式系统动态补丁长跳转的实现方法 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104318135A (zh) * | 2014-10-27 | 2015-01-28 | 中国科学院信息工程研究所 | 一种基于可信执行环境的Java代码安全动态载入方法 |
Also Published As
Publication number | Publication date |
---|---|
EP2487585A1 (en) | 2012-08-15 |
CN101697131A (zh) | 2010-04-21 |
EP2487585A4 (en) | 2013-06-19 |
US20120209895A1 (en) | 2012-08-16 |
EP2487585B1 (en) | 2019-09-11 |
WO2011054223A1 (zh) | 2011-05-12 |
US8566372B2 (en) | 2013-10-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101697131B (zh) | 一种可重定位文件动态加载的方法及装置 | |
CN1114155C (zh) | 计算机系统及其操作方法和控制装置 | |
CN113872948A (zh) | 一种执行智能合约的方法、区块链节点和节点设备 | |
CN1134731C (zh) | 在计算机系统中编译指令的方法 | |
US8453128B2 (en) | Method and system for implementing a just-in-time compiler | |
CN100481007C (zh) | 无需额外的代码分析来进行链接时代码优化的方法和系统 | |
EP3084596B1 (en) | Executable code for constrained computing environments | |
CN101984409A (zh) | 一种用于Linux系统测试代码注入的方法 | |
CN100530108C (zh) | 一种调用函数的方法及系统 | |
CN102364433B (zh) | 在ARM处理器上实现Wine构建工具移植的方法 | |
CN111770204B (zh) | 一种执行智能合约的方法、区块链节点和存储介质 | |
CN115495086A (zh) | 一种编译方法和编译器、Wasm虚拟机 | |
CN101882094A (zh) | 嵌入式系统制作补丁的方法和系统 | |
CN101334737A (zh) | 一种嵌入式设备的启动或复位方法 | |
Strumpen | Compiler technology for portable checkpoints | |
CN111770202B (zh) | 一种执行智能合约的方法、区块链节点和存储介质 | |
Ball et al. | Static TypeScript: an implementation of a static compiler for the TypeScript language | |
Reinking et al. | A type-directed approach to program repair | |
US9135027B1 (en) | Code generation and execution for dynamic programming languages | |
Chen et al. | Type-preserving compilation for large-scale optimizing object-oriented compilers | |
Ducasse et al. | Porting a JIT compiler to RISC-v: Challenges and opportunities | |
KR20040044655A (ko) | 자바 가상머신에서 루프 문 처리를 위해 바이트코드를생성 및 수행하는 방법 | |
Drescher et al. | Fast Template-Based Code Generation for MLIR | |
US20240134666A1 (en) | Hybrid just in time load module compiler with performance optimizations | |
Ramos et al. | Implementing Python for DrRacket |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |