一种动态加载方法、目标文件的制作方法及装置与流程

文档序号:17772557发布日期:2019-05-28 19:36阅读:124来源:国知局
本发明实施例涉及软件动态加载
技术领域
:,尤其涉及一种动态加载方法、目标文件的制作方法及装置。
背景技术
::随着计算机技术的发展,终端设备的功能越来越多,对于开发人员来说,每增加一个功能,就意味着增加若干的应用程序,所以开发人员在编写应用程序的代码时,需要考虑不同的应用程序的业务需求是否有重叠,对于重叠的部分,其代码通常可以被编译为一个动态链接库文件,当应用程序被执行时,加载该动态链接库文件即可,这个过程即为动态加载过程。因此,采用动态加载的方式,开发人员不需要在不同的编程任务(例如应用程序)中编写同样的代码,即一个动态链接库库可以为多个应用程序服务,大大的节省了终端设备的内存空间。目前,终端设备的应用程序被执行时,使用动态链接库文件的具体过程为,终端设备根据应用程序文件的符号名在全局符号表中寻找符号地址,图1示出了现有技术中全局符号表的示意图,然后根据符号地址从加载的动态库中调用符号。在实际操作过程中,由于全局符号表中的字符串名本身占用的内存资源比较大,所以终端设备在动态加载的过程中,消耗的内存资源较大。技术实现要素:本发明实施例提供一种目标文件的加载方法及装置,用以解决目前的动态加载方式消耗资源太大的技术问题。第一方面,本发明实施例提供一种动态加载方法,该方法可以从终端设备的角度进行描述,终端设备可以是手机、ipad等设备。该方法包括:在终端设备中的应用程序的运行过程中,加载动态链接库文件,所述动态链接库文件中包含能够实现所述应用程序中的特定功能的符号;所述符号包括函数和/或变量;从所述应用程序的源文件中读取第一数组索引index;从全局符号表中确定与所述第一index对应的第一符号地址;所述第一符号地址用于指示能够实现所述特定功能的符号的物理地址;根据所述第一符号地址从所述动态连接库文件中调用所述符号,完成所述应用程序的运行。在本发明实施例中,动态链接库文件中包含应用程序在运行过程中所需要的符号,所以终端设备在运行应用程序时,可以加载动态链接库文件,终端设备从应用程序的源文件中读取第一index,然后在全局符号表中确定与第一index对应的第一符号地址,进而根据第一符号地址从动态链接库文件中调用符号,由于index本身占据的内存相对较少,有助于节省资源。在一个可能的设计中,终端设备加载动态链接库文件时,包括:将所述动态链接库文件存储于所述终端设备的内存中;从所述动态链接库文件中的st_name代码中读取所述第一index;根据第一index与第二符号地址的映射关系确定与所述第一index对应的第二符号地址;所述第二符号地址用于指示所述动态链接库文件中能够实现所述特定功能的符号的逻辑地址;对所述第二符号地址进行重定位,得到所述第一符号地址;将所述第一符号地址填充在所述动态链接库文件中,完成所述动态链接库文件的加载。在本发明实施例中,终端设备加载动态链接库文件时,可以读取动态链接库文件中读取第一index,然后根据第一index与第二符号地址之间的映射关系确定于第一index对应的第二符号地址,然后对第二符号地址进行重定位,将重定位之后的地址填充到动态链接库文件中,完成动态链接库文件的加载,由于index占用的内存资源比较少,所以终端设备加载动态库文件占用的内存资源也较少。在一个可能的设计中,终端设备在全局符号表中确定与所述第一index对应的第一符号地址时,包括:构建所述全局符号表;所述全局符号表中包含第一index与第一符号地址之间的映射关系;根据所述第一index与第一符号地址的映射关系确定与所述第一index对应的第一符号地址。在本发明实施例中,全局符号表中包含第一index与第一符号地址之间的映射关系,由于index占用的内存资源较少,所以全局符号表占用的内存资源也较少。在一个可能的设计中,终端设备在全局符号表中确定与所述第一index对应的第一符号地址时,包括:构建所述全局符号表;所述全局符号表中包含所述第一符号地址,且所述第一符号地址按照一定的顺序排序;读取所述全局符号表中排序号与所述第一index的值相同的第一符号地址。在本发明实施例中,全局符号表中可以只包含第一符号地址,占用的内存资源更少,有助于节约资源。在一个可能的设计中,终端设备根据所述第一index与第一符号地址的映射关系确定与所述第一index对应的第一符号地址时,包括:确定所述第一index所属的功能模块;所述功能模块用于指示所述动态链接库文件中能够实现所述特定功能的模块;从所述全局符号表中确定与所述功能模块对应的模块符号表;所述模块符号表中包含所述功能模块中的符号的第一符号地址与第一index的映射关系;所述符号用于指示所述功能模块中用于实现所述特定功能的函数和/或变量;从所述模块符号表中的第一符号地址与第一index的映射关系读取与所述第一index对应的第一符号地址。在本发明实施例中,全局符号表中包含不同的模块符号表,每个模块符号表中包含该模块符号表对应的功能模块中的符号的第一符号地址,终端设备从第一index所属的功能模块对应的模块符号表中查找与第一index对应的第一符号地址,操作方便,而且index本身占用的内存资源比较少,有助于节约资源。在一个可能的设计中,终端设备确定所述第一index所属的功能模块,包括:获取与所述第一index关联的第二index;从功能模块与第二index之间的映射关系确定与所述第二index对应的功能模块。在本发明实施例中,终端设备可以根据功能模块与第二index之间的映射关系确定与所述读取的第二index对应的功能模块,由于index本身占用的内存资源比较少,有助于节省内存资源。第二方面,本发明实施例提供一种目标文件的制作方法。该方法可以从目标文件的制作装置的角度来描述,目标文件的制作装置可以是任何具备制作目标文件的能力的装置例如编译服务器。该方法包括:确定目标文件的源代码中所包含的符号的符号名;所述符号用于指示所述源代码中能够实现特定功能的函数或变量;根据符号名和数组索引index的映射关系确定与所述符号名对应的index;根据所述index生成所述目标文件。在本发明实施例中,目标文件的制作装置例如编译服务器在制作目标文件的过程中,确定与目标文件的源代码中所包含的符号的符号名对应的index,然后根据index生成目标文件。例如将目标文件中原来存储的符号名替换为index。这种方式下,目标文件中包含与符号的符号名对应的index,目标文件的占用空间比较少,方便终端设备的使用。在一个可能的设计中,所述目标文件为动态链接库文件和/或应用程序的源文件。在本发明实施例中,目标文件还可以是其他文件,以上几种只是举例,本发明实施例对此不作具体的限定。在一个可能的设计中,编译服务器根据所述index生成所述目标文件时,包括:确定所述目标文件中用于存放符号名的位置;将所述index填充在所述位置处。在本发明实施例中,编译服务器将与符号的符号名对应的index填充在存放符号名的位置处,方便读取。在一个可能的设计中,所述位置位于所述目标文件中的st_name代码段中。在本发明实施例中,编译服务器还可以将与符号的符号名对应的index存放在其它位置,本发明实施例对此不作具体的限定。第三方面,本发明实施例提供一种终端设备,该终端设备具有实现上述方法设计中终端设备的功能。这些功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的单元。在一个可能的设计中,终端设备的具体结构可包括加载模块、读取模块、确定模块和符号调用模块。这些模块或单元可执行上述第一方面或第一方面的任意一种可能的设计所提供的方法中的相应功能。第四方面,本发明实施例还提供一种目标文件的制作装置。该装置具有实现上述方法设计中编译服务器的功能。这些功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的单元。在一个可能的设计中,三维建模装置的具体结构可包括确定模块和文件生成模块。这些模块或单元可执行上述第二方面或第二方面的任意一种可能的设计所提供的方法中的相应功能。第五方面,本发明实施例还提供一种终端设备。该终端设备具有实现上述方法设计中终端设备的功能。这些功能可以通过硬件实现。该终端设备包括:存储器,用于存储计算机可执行程序代码;处理器,处理器与存储器耦合。其中存储器所存储的程序代码包括指令,当处理器执行所述指令时,所述指令使终端设备执行上述第一方面或第一方面的任意一种可能的设计中终端设备所执行的方法。第六方面,本发明实施例还提供一种目标文件的制作装置。该目标文件的制作装置具有实现上述方法设计中编译服务器的功能。这些功能可以通过硬件实现。该目标文件的制作装置包括:存储器,用于存储计算机可执行程序代码;处理器,处理器与存储器耦合。其中存储器所存储的程序代码包括指令,当处理器执行所述指令时,所述指令使目标文件的制作装置执行上述第二方面或第二方面的任意一种可能的设计中编译服务器所执行的方法。第七方面,本发明实施例还提供一种计算机可读存储介质,该计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第一方面所述的动态加载方法。第八方面,本发明实施例还提供一种计算机可读存储介质,该计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第二方面所述的目标文件的制作方法。第九方面,本发明实施例还提供一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面所述的动态加载方法。第十方面,本发明实施例还提供一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第二方面所述的目标文件的制作方法。在本发明实施例中,动态链接库文件中包含应用程序在运行过程中所需要的符号,所以终端设备在运行应用程序时,可以加载动态链接库文件,然后从应用程序的源文件中读取第一index,然后在全局符号表中确定与第一index对应的第一符号地址,进而根据第一符号地址从动态链接库文件中调用符号,由于index本身占据的内存相对较少,有助于节省资源。附图说明图1为现有技术中全局符号表的结构示意图;图2为本发明实施例提供的一种应用场景的示意图;图3为本发明实施例提供的一种目标文件的加载方法的流程图;图4为本发明实施例提供的目标文件中各个代码段中存储的内容的示意图;图5为现有技术中终端设备加载动态链接库文件的示意图;图6为本发明实施例中终端设备加载动态链接库文件的示意图;图7-11为本发明实施例提供的五种全局符号表的结构示意图;图12为本发明实施例中终端设备从全局符号表中确定第一符号地址的示意图;图13为本发明实施例提供的一种终端设备的结构示意图;图14为本发明实施例提供的一种目标文件的制作装置的结构示意图;图15为本发明实施例提供的另一种终端设备的结构示意图;图16为本发明实施例提供的另一种目标文件的制作装置的结构示意图。具体实施方式下面将结合本发明实施例中的附图,对本发明实施例提供的技术方案进行清楚、完整地描述。以下,对本发明实施例中的部分用语进行解释说明,以便于本领域技术人员理解。(1)目标文件,用于存储符号(或代码)的文件,一个目标文件中通常包含多个符号,符号可以是变量或者函数。终端设备加载目标文件之后,可以运行其内部存储的符号,实现特定的功能。目标文件的种类较多例如为应用程序文件的源文件、可执行(executableandlinkableformat,elf)文件、动态链接库文件、可重定向文件、共享目标文件、核心转储文件等等。(2)动态链接库文件,是一种不可执行的二进制程序文件,其中包含有可以被终端设备的多个应用程序共享的符号(代码)和其他资源。当终端设备中的应用程序被执行时,可以从动态链接库中调用相应的符号,完成应用程序的执行。在windows中,动态链接库文件通常为.dll文件(后缀为.dll),在linux系统中,动态链接库文件通常是.so文件(后缀为.so)。动态链接库文件通常存放在c/system目录下。动态链接库文件的使用,可以大大的节省应用程序的占用空间,即对于多个应用程序共同使用的公共的符号,可以存储在动态链接库文件中,当应用程序被执行时,从动态链接库文件中调用符号即可。由于动态链接库文件的使用,使得应用程序不至于太过巨大。(2)符号地址,即符号的存储地址,当终端设备确定符号地址之后,便可按照该符号地址加载符号,进而加载目标文件。符号地址通常有逻辑地址和实际物理地址之分,逻辑地址可以理解为编程人员在编写程序的过程中,为每个符号定义的逻辑地址。而物理地址为符号在终端设备内存中的真实的存储地址,终端设备的应用程序在调用符号时,通常使用的是符号的物理地址。(3)符号名,即符号的名称,在编程中,符号名即变量名或者函数名,一般由字母、数字和下划线组成。(4)数组索引,所谓数组即按顺序排列的同类数据元素的集合,也可理解为把有限个类型相同的变量或者函数进行编号,每个变量或函数的编号可称为数组标号或者数组索引,数组索引可以是二进制、十进制等等。(5)重定位,即将目标文件的符号的逻辑地址变换成内存中的实际物理地址的过程,也可以理解为在加载目标文件时对目标文件中指令或数据的修改过程,前面提到过,应用程序执行过程中,调用符号时,通常使用的是符号的物理地址,而编译人员在编译符号时使用的符号地址(逻辑地址)并不一定适合终端设备内存中的实际物理地址,所以调用符号之前,需要对符号地址进行重定位。(6)本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中字符“/”,如无特殊说明,一般表示前后关联对象是一种“或”的关系。且在本发明的描述中,“第一”、“第二”等词汇,仅用于区分描述的目的,而不能理解为指示或暗示相对重要性,也不能理解为指示或暗示顺序。为更好地介绍本发明实施例中的动态加载方法,下面首先介绍本发明实施例的一种应用场景,请参见图2。如图2所示,本发明实施例提供的应用场景中包括两部分,第一部分为编译服务器,第二部分为终端设备。当然,在实际操作过程中,编译服务器还可以是其它服务器,只要可以用于编译代码生成目标文件即可,终端设备可以是手机、平板电脑等。其中,编译服务器用于编译生成目标文件,即编译人员通过编译服务器编译代码,进而生成目标文件,具体过程为,编译服务器中包含编译系统,编译人员通过编译服务器输入源代码,源代码经过编译系统,输出目标文件。而终端设备用于加载运行由编译服务器生成的目标文件。在本发明实施例中,目标文件可以是应用程序文件的源文件或者动态链接库文件。以动态链接库文件为例,编译服务器生成动态链接库之后,终端设备中的应用程序被执行时,可以加载动态链接库文件。目前,终端设备的应用程序被执行时,使用动态链接库文件的具体过程为,终端设备根据应用程序文件的符号名在全局符号表中寻找符号地址,图1示出了现有技术中全局符号表的示意图,然后根据符号地址从加载的动态库中调用符号。在实际操作过程中,由于全局符号表中的字符串名本身占用的内存资源比较大,所以终端设备在动态加载的过程中,消耗的内存资源较大。为了解决该技术问题,本发明实施例提供一种动态加载方法。即,在终端设备中的应用程序的运行过程中,加载动态链接库文件,所述动态链接库文件中包含能够实现所述应用程序中的特定功能的符号;所述符号包括函数和/或变量;从所述应用程序的源文件中读取第一数组索引index;从全局符号表中确定与所述第一index对应的第一符号地址;所述第一符号地址用于指示能够实现所述特定功能的符号的物理地址;根据所述第一符号地址从所述动态连接库文件中调用所述符号,完成所述应用程序的运行。在本发明实施例提供的方法中,由于index本身占据的内存相对较少,所以有助于节省内存资源。在介绍本发明实施例提供的动态加载方法之前,先介绍目标文件(应用程序的源文件或动态链接库文件)的制作过程。具体请参考图3,为本发明实施例提供的目标文件的制作方法的流程图。以图2所示的应用场景为例,该方法适用于图2中的编译服务器。因此,图3也可以理解为图2中的编译服务器和终端设备之间的信息交互示意图。该方法的流程描述如下:s301:编译服务器确定源代码中所包含的符号的符号名,符号用于指示所述源代码中能够实现设定功能的函数或变量。前面已经提到过,编译人员通过编译服务器输入源代码,源代码中包含多个符号以及每个符号的符号名,这里的符号可以是变量或者函数,符号名即变量名或者函数名。举例来说,编译人员输入源代码中包含5个函数,编译服务器确定5个函数的函数名分别为fun1、fun2、fun3、fun4、fun5。s302:编译服务器根据符号名和数组索引index的映射关系确定与符号名对应的index。在本发明实施例中,index可以是二进制、十进制、十六进制等等。作为一种示例,编译服务器可以事先存储符号名和数组索引index的映射关系,在确定源代码中所包含的符号的符号名之后,可以在符号名和index的映射关系中查询与每个符号名对应的index。当然,在实际操作过程中,编译服务器在确定源代码中包含的符号的符号名之后,也可以直接将每个符号的符号名进行排序,则每个符号的符号名对应一个排序号,将排序号(十进制、二进制等)作为index即可。s303:编译服务器根据index生成目标文件。在实际操作过程中,编译人员在编译源代码时,是通过编译不同的代码段进而完成源代码的编译,不同的代码段存储不同的符号(变量或函数),以实现不同的功能。因此,若编译服务器确定每个符号名对应的index之后,可以直接将index填充在要生成的目标文件中,或者若编译服务器将每个符号的符号名进行排序,也可以直接将排序号(二进制、十进制等)填充在要生成的目标文件中,以生成目标文件。作为一种示例,编译服务器将index填充在目标文件的实现方式可以是,编译服务器确定要生成的目标文件中用于存放符号名的位置,然后用index替换符号名,即将index填充在在该位置处。以目标文件是动态链接库文件.so文件为例,.so文件中用于存放符号名的位置为dynsym段代码段中的st_name代码段,所以,编译服务器可以将index填充于st_name代码段中。举例来说,编译服务器中确定出的符号名分别为fun1、fun2、fun3、fun4、fun5,并且根据符号名和index的映射关系,确定出与fun1、fun2、fun3、fun4、fun5分别对应的index(十进制)为1、2、3、4、5,则编译服务器将index填充在st_name代码段中。具体请参见图4所示,为本发明实施例提供的.so文件中各个代码段中存储的代码内容,如图4所示,.so文件中包含.rel代码段,而.rel代码段中包含.dynsym代码段,dynsym代码段中st_name代码段用于存储index,如图4所示,st_name代码段中存储有5个符号各自对应的index即1-5。当然,在实际操作过程中,编译服务器也可以将index存储在其它的位置处,或者单独设置一个用于存储index的代码段,无论将index存储在什么位置,只要终端设备能够读取到index即可。由于动态链接库文件中包含有应用程序所使用的符号以及这些符号的符号名,而应用程序的源文件中往往也包含这些符号的符号名(或者符号指针),当应用程序被运行时,终端设备从动态链接库文件中调用与该符号名对应的符号。因此,在本发明实施例中,编译服务器在制作动态链接库文件和应用程序的源文件时,使用的符号名和index的映射关系可以是相同的,即制作好的动态链接库文件和应用程序的源文件中的index是对应的。若目标文件可以是应用程序的源文件,终端设备下载应用程序时,可以将应用程序的源文件加载到自身的内存中执行。下文的描述以终端设备已经将编译服务器制作好的应用程序的源文件加载到内存中,并运行该应用程序为例进行说明,即终端设备使用动态链接库文件来完成应用程序的运行过程。请继续参见图3,终端设备使用动态链接库文件运行应用程序的过程包括:s304:在终端设备中的应用程序的运行过程中,加载动态链接库文件,所述动态链接库文件中包含能够实现所述应用程序中的特定功能的符号;所述符号包括函数和/或变量。前面已经提到过,动态链接库文件中包含有应用程序被执行时多使用的符号,即应用程序被执行时需要加载动态链接库文件,所以终端设备中的应用程序被执行时,可以首先将动态链接库文件加载在终端设备的操作系统中以便应用程序的使用。下面介绍终端设备加载动态链接库文件的过程。在本发明实施例中,终端设备加载动态链接库文件的过程可以分五步进行,第一步,终端设备将所述动态链接库文件存储于自身的内存中;第二步,从所述动态链接库文件中的st_name代码中读取所述第一index;第三步,根据第一index与第二符号地址的映射关系确定与所述第一index对应的第二符号地址;所述第二符号地址用于指示所述动态链接库文件中能够实现所述特定功能的符号的逻辑地址;第四步,对所述第二符号地址进行重定位,得到所述第一符号地址;第五步,将所述第一符号地址填充在所述动态链接库文件中,完成所述动态链接库文件的加载。第一步中,终端设备可以从编译服务器中下载动态链接库文件,并将动态链接库文件存储在自身的内存中。前面提到过,由于编译服务器在制作动态链接库文件时,在st_name代码中填充了第一index,所以在第二步中,终端设备只需读取第一index即可。第三步,终端设备加载第一index与第二符号地址的映射关系,并从该映射关系中确定与第一index对应的第二符号地址,这里确定出的第二符号地址是逻辑地址。需要说明的是,由于第二符号地址是编译人员编写代码时,对每个符号使用的逻辑地址,所以可以将逻辑地址存储下来,然后建立第一index与逻辑地址(第二符号地址)之间的映射关系。建立第一index与逻辑地址之间的映射关系的过程可以由终端设备自身执行,当然为了缓解终端设备的压力,也可以由编译服务器执行,若是由编译服务器执行,则第三步中,终端设备只需从编译服务器中加载该映射关系即可。图5示出了现有技术中终端设备加载动态链接库文件的示意图。由于现有技术中,编译服务器在生成动态链接库文件的过程中,在动态链接库文件中存储的是每个符号的符号名,而且构建的是符号名和第二符号地址的映射关系。因此,在图10中,终端设备加载动态链接库文件的过程中,从动态链接库文件中读取每个符号的符号名之后,根据符号名和第二符号地址的映射关系确定与符号名对应的第二符号地址。由于字符名通常是字符串,占用的内存资源较大,所以现有技术中加载动态链接库文件时占据的内存资源较大。图6示出了本发明实施例中终端设备加载动态链接库文件的示意图。前面已经提到过,编译服务器在制作动态链接库文件的过程中,将与符号名对应的index填充于动态链接库文件中,所以编译服务器构建的是index和第二符号地址的映射关系。因此,在图11中,终端设备从动态链接库文件中的.rel代码段中的.dynsym代码段中的st_name代码段中读取5个第一index,分别为index1-index5,然后从index和第二符号地址的映射关系中确定与每个index对应的第二符号地址。因此,终端设备加载动态链接库文件的过程中占用的内存资源较少,较为节省资源。由于第二符号地址是逻辑地址,所以需要对第二符号地址进行重定位,即第四步。第四步的实现方式可以有多种,例如,终端设备可以从动态链接库文件中的.rel代码段中的.reldyn段中的r_info代码段中读取重定位信息。然后根据该重定位信息对第二符号地址进行重定位,较为简单的实现过程为,终端设备可以将第二符号地址加上重定位信息(符号偏移地址),即可得到重定位之后的符号地址,即第一符号地址。当然,在实际操作过程中,对符号地址进行重定位的还可以采取其它的方式,本发明实施例对此不作具体的限定。对第二符号地址重定位之后,可以执行第五步,即将重定位之后的第一符号地址填充到动态链接库文件中,完成动态链接库文件的加载。作为一种示例,请继续参见图6所示,在第五步中,终端设备可以将重定位之后的符号地址填充到rel代码段中r_offset指示的.got代码段中,即完成加载。s305:终端设备从应用程序的源文件中读取第一数组索引index。前面已经介绍过,编译服务器在生成应用程序的源文件的过程中,在源文件中相应的位置处存储index,所以终端设备只需在对应的位置处读取index即可。前面已经提到过,编译服务器在制作动态链接库文件和应用程序的源文件时,使用的符号名和index的映射关系可以是相同的,即制作好的动态链接库文件和应用程序的源文件中的index是对应的。因此,s305中终端设备从应用程序的源文件中读取的第一index,与动态链接库文件中的第一index代表的是相同的符号。s306:终端设备从全局符号表中确定与第一index对应的第一符号地址;第一符号地址用于指示能够实现所述特定功能的符号的物理地址。在s305之前,终端设备需要获得全局符号表。下面接收终端设备获得全局符号表的几种实现方式。第一种实现方式,前面已经提到过,编译服务器可以建立第一index与第二符号地址(逻辑地址)之间的映射关系,而第一符号地址是对第二符号地址进行重定位得到的,所以终端设备可以进一步建立第一index与第一符号地址之间的映射关系,该映射关系可以直接作为全局符号表。图7示出了本发明实施例提供的第一种全局符号表的示意图。如图7所示,全局符号表中包含第一index与第一符号地址的映射关系。由于index本身占据的内存资源比较少,所以全局符号表占据的资源相对较小,较为节约资源。第二种实现方式,终端设备得到第一符号地址之后,可以直接将所有第一符号地址按照一定的顺序进行排序,排序好的第一符号地址可以直接作为全局符号表使用,即全局符号表中index的值为空,只包含第一符号地址。图8示出了本发明实施例提供的第二种全局符号表的示意图。如图8所示,全局符号表中只包含第一符号地址。在第二种方式下,由于全局符号表中只包含第一符号地址,所以全局符号表占据的内存资源更少,更加节约资源。第三种实现方式,在实际操作过程中,动态链接库文件中可能包含不止一个功能模块,每个功能模块包含各自的多个符号,用来实现特定的功能,这里的功能模块可以理解为动态链接库中的子文件等,即不同的功能模块可以实现不同的功能。因此,终端设备在构建全局符号表时,可以为每个功能模块设立单独的模块符号表,所有功能模块的模块符号表构成全局符号表。作为一种示例,编译服务器在制作动态链接库文件时,可以将能够实现特定功能的符号作为一个功能模块整体存储,以符号具体是函数为例,函数fun1-fun3是用来实现某个功能的,即将这三个函数作为整体存储在该功能模块对应的文件中,因此,终端设备在构建全局符号表时,只需要在每个功能模块对应的文件中读取该动能模块中所包含的符号的第一index即可。因此,为了区分每个功能模块,终端设备构建全局符号表时,可以为每个功能模块添加模块标识例如模块id,然后为每个功能模块构建模块符号表,进而得到全局符号表,所以这种方式下,全局符号表中不仅包括每个功能模块所包含的符号的第一符号地址,还可以包括每个功能模块的模块id。图9示出了本发明实施例提供的第三种全局符号表的示意图,如图9所示,全局符号表中包含第一符号地址和模块id,其中,每个第一符号地址对应一个index,每个模块id也对应一个index,为了区分开来,第一符号地址对应第一index,模块id对应第二index。第四种实现方式,全局符号表中不仅包括每个功能模块所包含的符号的第一符号地址,还可以包括每个功能模块的模块id,将所有模块id和第一符号地址按照一定的顺序排序,即每个模块id都有一个排序号,而且每个第一符号地址也有一个排序号。图10示出了本发明实施例提供的第四种全局符号表的示意图,如图10所示,全局符号表中第一符号地址和模块id按照一定的顺序进行排序。第五种实现方式,全局符号表中不仅包括每个功能模块所包含的符号的符号地址,还可以包括每个功能模块的模块id,其中,每个模块id对应一个模块符号表,每个模块符号表中包含每个模块所包含的所有符号的符号地址。举例来说,全局符号表中包含三个模块id,其中一个是模块0,则模块0对应的模块符号表中包含模块0所包含的所有符号的符号地址,每个符号地址均以0为开头,即第一个符号地址对应的index可以为0x0001,该模块符号表中后续的其它符号地址依次类推。图11示出了本发明实施例提供的第五种全局符号表的示意图,如图11所示,全局符号表中包含两个模块以及每个模块对应的模块符号表。以上只是列举了全局符号表的五种可能的实现方式,在实际操作过程中,上述的五种方式可以结合使用,例如全局符号表中部分第一符号地址或模块id按照一定的顺序进行排序,另一部分第一符号地址或模块id中每个第一符号地址或模块id对于一个index,只要能够唯一的标识第一符号地址或模块id即可。以上介绍了五种终端设备构建全局符号表的方式,当终端设备构建好全局符号表之后,可以执行s306,即终端设备从全局符号表中确定与第一index对应的第一符号地址。由于上面介绍了五种全局符号表,下面将介绍对于不同的全局符号表,s306的不同实现过程。对于前面提到的第一种实现方式即图7所示的全局符号表来说,由于全局符号表中包含第一index与第一符号地址的映射关系。因此,终端设备从应用程序的源文件中读取出第一index之后,可以在全局符号表中查找与第一index对应的第一符号地址。对于前面提到的第二种实现方式即图8所示的全局符号表来说,由于全局符号表中所有第一符号地址是按照一定顺序排序的,所以每个第一符号地址对应一个排序号。终端设备从应用程序的源文件中读取出第一index之后,若第一index的取值与某个第一符号地址的排序号相同,那么终端设备确定这个第一符号地址是与该第一index对应的第一符号地址。举例来说,终端设备从应用程序的源文件中读取出5个第一index,即index1-index5,其取值分为为1-5,然后终端设备在全局符号表中确定排序号分别为1-5的第一符号地址,即addr1、addr2、addr3、addr4、addr5。对于前面提到的第三种实现方式即图9所示的全局符号表来说,由于全局符号表中包含第一符号地址和模块id,其中,第一符号地址对应第一index,模块id对应第二index。若第一index和第二index是同一个index的高低位,即终端设备读取应用程序的源文件中的第一index之后,可以根据第一index中的高位部分确定模块id,根据第一index的低位部分确定第一符号地址。举例来说,请参见图12所示,终端设备从应用程序的源文件中读取的第一index为32bit的整数,可以将index划分为高位和低位两部分,例如高12bit和低20bit。其中,高12bit作为模块id的计数部分,低20bit作符号地址的计数部分,即终端设备根据高12bit从全局符号表中确定模块id,然后根据低20bit从全局符号表中确定第一符号地址。当然,在实际操作过程中,index还可以是8bit、16bit或者64bit等,即index的位宽可根据实际情况定,其中,模块id和第一符号地址的位宽也可根据实际情况而定,本发明实施例不作具体的限定。若第一index和第二index是相互独立的,终端设备还可以从应用程序的源文件中读取第二index,然后从全局符号表中确定于第二index对应的模块id,并根据读取的第一index从全局符号表中确定于第一index对应的第一符号地址。对于前面提到的第四种实现方式即图10所示的全局符号表来说,全局符号表中包含模块id和第一符号地址,并且模块id和第一符号地址按照一定的顺序排序,即每个模块id对应一个排序号,每个第一符号地址对应一个排序号。终端设备从应用程序的源文件中读取第一index之后,可以在全局符号表中确定排序号与第一index的取值相同的第一符号地址。作为一种示例,终端设备读取应用程序的源文件中的第一index之后,可以根据第一index中的高位部分确定模块id,根据第一index的低位部分确定第一符号地址。举例来说,终端设备读取的第一index为32位整数,可以将index划分为高位和低位两部分,例如高12bit和低20bit。终端设备可以从全局符号表中确定排序号与高12bit的值相同的模块id,并从全局符号表中确定排序号与低20bit的值相同的第一符号地址。对于前面提到的第五种实现方式即图11所示的全局符号表来说,由于全局符号表中包括每个功能模块所包含的符号的第一符号地址,还可以包括每个功能模块的模块id,其中,每个模块id对应一个模块符号表,每个模块符号表中包含所述每个模块所包含的所有符号的第一符号地址。作为一种示例,终端设备读取的第一index为32位整数,可以将index划分为高位和低位两部分,例如高12bit和低20bit。终端设备可以从全局符号表中确定排序号与高12bit的值相同的模块id之后,可以在模块id对应的模块符号表中确定排序号与低20bit的值相同的第一符号地址。无论全局符号表的上述哪种结构,终端设备的应用程序被执行时,可以通过dlsym函数接口从全局符号表中获取第一符号地址。现有技术中,由于全局符号表中包含符号地址和符号名的对应关系,所以现有技术中用来从全局符号表中获取符号地址的函数接口通常是void*dlsym(void*handle,constchar*symbol)。其中,handle是由dlopen函数接口打开目标文件后返回的指针,symbol就是要求获取的符号的符号名,函数返回值是void*,指向符号的符号地址(函数地址),供调用使用,即现有技术中的dlsym函数需要读取符号名,然后返回符号名对应的符号地址,但是本发明实施例中,全局符号表中包含index和第一符号地址的映射关系,所以dlsym函数接口只需读取index,返回index对应的第一符号地址即可。在本发明实施例中,动态链接库文件可能会被多个应用程序使用,而不同的应用程序可能调用动态链接库文件中的不同符号,所以当某个应用程序需要动态链接库文件中的某些符号时,终端设备可以构建包含这些符号的第一index与第一符号地址之间的映射关系的全局符号表即可,当其他应用程序需要动态链接库文件中的另一些符号时,终端设备可以进一步补充全局符号表,即将另一些符号的第一index与第一符号之间的映射关系补充到全局符号表中。s307,根据第一符号地址从动态连接库文件中调用符号,完成应用程序的运行。前面已经提到过,动态链接库文件中存储着应用程序被执行时所使用的符号,所以终端设备确定第一index对应的第一符号地址即物理地址之后,即终端设备确定了动态链接库文件中的、存放在终端设备中的符号的物理地址,所以终端设备可根据该第一符号地址调用动态链接库中的符号即可。在本发明实施例中,终端设备在需要动态链接库文件时,可以通过dlopen函数接口加载动态链接库文件,当终端设备不需要动态链接库文件时,可以通过dlclose函数接口释放动态链接库文件以及全局符号表,以节省终端设备的内存资源。总结来说,本发明实施例提供的一种目标文件的制作方法,例如将目标文件(动态链接库文件或者应用程序中的源文件)中的符号名替换为第一index,完成目标文件的制作。本发明实施例还提供一种动态加载方式,终端设备在运行应用程序时,若需要使用动态链接库文件中的符号,则加载动态链接库文件,并构建全局符号表,该全局符号表中包含第一index与第一符号地址的映射关系,终端设备读取应用程序的源文件中读取第一index之后,可以从全局符号表中确定与第一index对应的第一符号地址,然后根据第一符号地址调用动态链接库文件中的符号,完成应用程序的运行。在这整个过程中,终端设备使用的均是index,而index本身占据的内存相对较少,有助于节省内存资源。下面结合附图介绍本发明实施例提供的设备。图13示出了一种终端设备1300的结构示意图。该终端设备1300可以实现上文中涉及的终端设备的功能。该终端设备1300可以包括加载模块1301、读取模块1302,确定模块1303以及符号调用模块1304。其中,加载模块1301可以用于执行图3所示的实施例中的s304,和/或用于支持本文所描述的技术的其它过程。读取模块1302可以用于执行图3所示的实施例中的s305,和/或用于支持本文所描述的技术的其它过程。确定模块1303可以用于执行图3所示的实施例中的s306,和/或用于支持本文所描述的技术的其它过程。符号调用模块1304可以用于执行图3所示的实施例中的s307,和/或用于支持本文所描述的技术的其它过程。其中,上述方法实施例涉及的各步骤的所有相关内容均可以援引到对应功能模块的功能描述,在此不再赘述。需要说明的是,在本发明实施例中,上述终端设备以功能单元的形式展示。在不受限制的情况下,本文所使用的术语“单元”可指执行一个或多个软件或固件程序的专用集成电路(application-specificintegratedcircuit,asic)、电子电路、(共享、专用或组)处理器以及存储器,组合逻辑电路,和/或提供所述功能的其它合适的部件。图14示出了一种目标文件的制作装置1400的结构示意图。该目标文件的制作装置1400可以实现上文中涉及的编译服务器的功能。该目标文件的制作装置1400可以包括确定模块1401和文件生成模块1402。其中,确定模块1401可以用于执行图3所示的实施例中的s301-s302,和/或用于支持本文所描述的技术的其它过程。文件生成模块1402可以用于执行图3所示的实施例中的s303,和/或用于支持本文所描述的技术的其它过程。其中,上述方法实施例涉及的各步骤的所有相关内容均可以援引到对应功能模块的功能描述,在此不再赘述。需要说明的是,在本发明实施例中,上述目标文件的制作装置以功能单元的形式展示。在不受限制的情况下,本文所使用的术语“单元”可指执行一个或多个软件或固件程序的专用集成电路(application-specificintegratedcircuit,asic)、电子电路、(共享、专用或组)处理器以及存储器,组合逻辑电路,和/或提供所述功能的其它合适的部件。在一个简单的实施例中,本领域的技术人员可以想到,还可以将图13所示的终端设备通过如图15所示的结构实现。如图15所示,终端设备1500可以包括:存储器1501、处理器1502和总线1503。处理器1501和处理器1502可以通过总线1503连接。其中,存储器1501用于存储计算机执行指令,当终端设备1500运行时,处理器1502执行存储器1501存储的计算机执行指令,以使终端设备1500执行图3所示的实施例提供的动态加载方法。具体的动态加载方法可参考上文及附图中的相关描述,此处不再赘述。在本发明实施例中,处理器1502可以是现场可编程门阵列(field-programmablegatearray,fpga),专用集成芯片(applicationspecificintegratedcircuit,asic),系统芯片(systemonchip,soc),中央处理器(centralprocessorunit,cpu),网络处理器(networkprocessor,np),数字信号处理电路(digitalsignalprocessor,dsp),微控制器(microcontrollerunit,mcu),还可以采用可编程控制器(programmablelogicdevice,pld)或其他集成芯片。总线1503可以是外设部件互连标准(peripheralcomponentinterconnect,pci)总线或扩展工业标准结构(extendedindustrystandardarchitecture,eisa)总线等。总线1503可以分为地址总线、数据总线、控制总线等。为便于表示,图15中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。在一个简单的实施例中,本领域的技术人员可以想到,还可以将图14所示的目标文件的制作装置通过如图16所示的结构实现。如图16所示,目标文件的制作装置1600可以包括:存储器1601、处理器1602和总线1603。处理器1601和处理器1602可以通过总线1603连接。其中,存储器1601用于存储计算机执行指令,当目标文件的制作装置1600运行时,处理器1602执行存储器1601存储的计算机执行指令,以使目标文件的制作装置1600执行图3所示的实施例提供的动态加载方法。具体的动态加载方法可参考上文及附图中的相关描述,此处不再赘述。在本发明实施例中,处理器1602可以是现场可编程门阵列(field-programmablegatearray,fpga),专用集成芯片(applicationspecificintegratedcircuit,asic),系统芯片(systemonchip,soc),中央处理器(centralprocessorunit,cpu),网络处理器(networkprocessor,np),数字信号处理电路(digitalsignalprocessor,dsp),微控制器(microcontrollerunit,mcu),还可以采用可编程控制器(programmablelogicdevice,pld)或其他集成芯片。总线1603可以是外设部件互连标准(peripheralcomponentinterconnect,pci)总线或扩展工业标准结构(extendedindustrystandardarchitecture,eisa)总线等。总线1603可以分为地址总线、数据总线、控制总线等。为便于表示,图16中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。综上所述,本发明实施例提供的一种目标文件的制作方法,例如将目标文件(动态链接库文件或者应用程序中的源文件)中的符号名替换为第一index,完成目标文件的制作。本发明实施例还提供一种动态加载方式,终端设备在运行应用程序时,若需要使用动态链接库文件中的符号,则加载动态链接库文件,并构建全局符号表,该全局符号表中包含第一index与第一符号地址的映射关系,终端设备读取应用程序的源文件中读取第一index之后,可以从全局符号表中确定与第一index对应的第一符号地址,然后根据第一符号地址调用动态链接库文件中的符号,完成应用程序的运行。在这整个过程中,终端设备使用的均是index,而index本身占据的内存相对较少,有助于节省内存资源。在上述发明实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如,固态硬盘solidstatedisk(ssd))等。以上实施例仅用以对本发明实施例的技术方案进行详细介绍,但以上实施例的说明只是用于帮助理解本发明实施例的方法及其核心思想,不应该理解为对本申请的限制。本领域技术人员在本发明实施例揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明实施例的保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1