一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

程序编译和程序加载方法与流程

2022-11-12 19:41:36 来源:中国专利 TAG:
1.本技术涉及数据处理
技术领域
:,尤其涉及一种程序编译和程序加载方法。
背景技术
::2.随着物联网技术的不断发展,物联网设备逐渐进入人们的生活和工作之中。实时操作系统(realtimeoperatingsystem,rtos)具有及时响应和高可靠性的特点,而被广泛作为物联网设备的操作系统。3.物联网设备可安装应用程序实现特定功能。在安装应用程序时,rtos加载应用程序的可执行文件至本地。其中,应用程序的可执行文件越大,占用物联网设备的内存越多。技术实现要素:4.本技术的多个方面提供一种程序编译和程序加载方法,用以降低应用程序的可执行文件的内存占用。5.本技术实施例提供一种程序编译方法,包括:6.获取应用的源代码编译得到的多个目标文件;7.对所述多个目标文件的代码段和数据段分别进行合并处理,以得到目标代码段和目标数据段;8.根据所述目标代码段和所述目标数据段中的符号位置,修改所述多个目标文件对应的符号表和重定位表,以得到第一符号表和第一重定位表;9.从所述第一符号表中,获取所述第一重定位表对应的第二符号表;10.根据所述目标代码段、所述目标数据段、所述第二符号表及第一重定位表,生成所述应用的可执行文件。11.本技术实施例还提供一种程序加载方法,包括:12.获取应用的可执行文件;13.对所述可执行文件进行解析,以得到所述可执行文件包含的代码段、数据段、字串表、重定位表及所述重定位表对应的符号表;14.根据所述字串表、符号表及所述重定位表,对所述代码段中需要重定位的指令进行重定位;15.基于所述数据段,执行重定位后的指令及所述代码段中无需重定位的指令,以加载所述应用。16.本技术实施例还提供一种计算机设备,包括:存储器和处理器;其中,所述存储器,用于存储计算机程序;17.所述处理器耦合至所述存储器,用于执行所述计算机程序以用于执行上述程序编译和/或程序加载方法中的步骤。18.本技术实施例还提供一种计算机程序产品,包括:计算机程序;所述计算机程序被处理器执行用于实现上述程序编译和/或程序加载方法。19.本技术实施例还提供一种存储有计算机指令的计算机可读存储介质,当所述计算机指令被一个或多个处理器执行时,致使所述一个或多个处理器执行上述程序编译和/或程序加载方法中的步骤。20.在本技术实施例中,在应用程序编译时,一方面,对应用源代码编译的多个目标文件的代码段和数据段进行合并处理,得到目标代码段和目标数据段,可减少表头信息;另一方面,仅保留应用加载时所需的重定位表对应的符号表,可减少符号表的空间消耗;因此,有助于减少后续根据目标代码段、目标数据段和重定位表及重定位表对应的符号表,生成的应用的可执行文件的大小,进而有助于降低加载应用时的内存消耗。附图说明21.此处所说明的附图用来提供对本技术的进一步理解,构成本技术的一部分,本技术的示意性实施例及其说明用于解释本技术,并不构成对本技术的不当限定。在附图中:22.图1a为本技术实施例提供的程序编译方法的流程示意图;23.图1b为本技术实施例提供的目标文件和可执行文件的组成示意图;24.图2为本技术实施例提供的程序加载方法的流程示意图;25.图3为本技术实施例提供的计算机设备的结构示意图。具体实施方式26.为使本技术的目的、技术方案和优点更加清楚,下面将结合本技术具体实施例及相应的附图对本技术技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。27.实时操作系统(realtimeoperatingsystem,rtos)具有及时响应和高可靠性的特点,而被广泛作为物联网设备的操作系统。在实际应用中,一些rtos系统,需要用户应用代码与操作系统内核编译在一起,作为一个完整的可执行文件。用户应用无法单独编译,且无法单独ota升级。28.一些rtos系统不支持so文件动态加载,还有一些rtos系统支持.o文件动态加载或者elf文件动态加载,允许用户将用户应用程序单独编译成程序动态加载到rtos系统中运行。29.但是,实际应用中,对于支持.o文件动态加载的rtos系统要,需要在.o文件中存储代码的代码段、数据段、符号表、重定位表、字串表等信息,会导致.o文件大小增加1/3左右。另一方面,不同的编译器,生成的.o文件代码段、数据段、符号表、重定位表、字符串表的组织形式也有差异,导致rtos系统中无法使用同一套代码加载不同的编译器编译的.o文件。30.对于要支持elf文件动态加载的rtos系统来说,需要编译器支持位置无关elf编译,部分编译器不支持该特性。对于支持位置无关elf编译的编译器,支持方式也不统一,导致rtos系统无法使用同一套代码加载不同编译器编译的elf文件。同时,该方案要求每个elf文件中都集成c/c 库。对于计算机设备来说,加载的用户应用个数越多,耗费的空间越大。31.综上分析可知,常规方案中普遍存在rtos系统加载的应用文件较大,导致内存消耗较大的问题。32.针对现有应用程序加载占用内存空间较大的技术问题,在本技术一些实施例中,在应用程序编译时,一方面,对应用源代码编译的多个目标文件的代码段和数据段进行合并处理,得到目标代码段和目标数据段,可减少表头信息;另一方面,仅保留应用加载时所需的重定位表对应的符号表,可减少符号表的空间消耗;因此,有助于减少后续根据目标代码段、目标数据段和重定位表及重定位表对应的符号表,生成的应用的可执行文件的大小,进而有助于降低加载应用时的内存消耗。33.以下结合附图,详细说明本技术各实施例提供的技术方案。34.应注意到:相同的标号在下面的附图以及实施例中表示同一物体,因此,一旦某一物体在一个附图或实施例中被定义,则在随后的附图和实施例中不需要对其进行进一步讨论。35.图1a为本技术实施例提供的程序编译方法的流程示意图。如图1a所示,该方法包括:36.101、获取应用的源代码编译得到的多个目标文件。37.102、对多个目标文件的代码段和数据段分别进行合并处理,以得到目标代码段和目标数据段。38.103、根据目标代码段和目标数据段中的符号位置,修改多个目标文件对应的符号表和重定位表,以得到第一符号表和第一重定位表。39.104、从第一符号表中,获取第一重定位表对应的第二符号表。40.105、根据目标代码段、目标数据段、第二符号表及第一重定位表,生成应用的可执行文件。41.在本实施例中,应用是指待编译应用。该应用可为一个或多个软件功能模块。多个是指2个或2个以上。在实际应用软件开发完成后,还需对应用的源代码进行编译生成可执行文件,该可执行文件可供计算机设备进行加载,实现应用功能。其中,应用程序的可执行文件越大,占用计算机设备的内存越多。42.在本实施例中,为了降低计算机设备加载应用时的内存空间消耗,在对应用进行编译时,在步骤101中,可获取应用的源代码编译得到的多个目标(object)文件。多个是指2个或2个以上。目标文件可为.o文件或.obj文件等。对于操作系统为rtos的计算机设备来说,目标文件可为.o文件。43.可选地,可对应用的源代码(如.c文件等)进行预处理,如宏定义检查并展开、预处理指令、注释替换空格、头文件等;进一步,对预处理后的文件(如.i文件等)进行词法分析、语义分析、语法分析及优化后生成相应的汇编代码(如.s文件等);进一步,可由汇编器将汇编代码转变成机器可以执行的指令,得到目标文件(如.o文件等)。44.在本实施例中,为了减少应用的可执行文件的大小,在步骤102中,对可对多个目标文件的代码段和数据段分别进行合并处理,得到目标代码段和目标数据段,这样,可将多个目标文件合并为一个目标文件,减少表头信息。45.对于应用来说,源代码文件可能引用或依赖另一源代码文件,这就导致对应用的源代码编译得到的多个目标文件之间存在引用关系。基于此,在步骤102之前,可对多个目标文件进行链接,以得到应用的中间文件。链接的主要任务就是将各个目标文件以及目标文件中各模块之间的相互引用的部分正确的衔接起来,得到中间文件。该中间文件的文件类型可与多个目标文件一致。例如,多个目标文件为.o文件,则对多个目标文件进行链接得到的中间文件也可为.o文件。46.可选地,可对多个目标文件采用部分链接的方式进行链接,得到应用的中间文件。其中,上述对多个目标文件进行链接的操作,可由编译器完成。47.进一步,可从中间文件中获取多个目标文件分别对应的代码段和数据段。48.由于不同编译器生成的目标文件的组织形式不同,即目标文件中代码段、数据段、符号表、重定位表及字串表的组织形式不同,因此,计算机设备的操作系统(如rtos系统)中无法使用同一套代码对不同编译器生成的目标文件进行加载。为了解决该问题,在本技术实施例中,可预设编译器标识与目标文件格式之间的对应关系,这样,在从中间文件中获取多个目标文件分别对应的代码段和数据段时,可获取对应用的源代码进行编译的编译器标识;并利用编译器标识在预设的编译器标识与目标文件格式之间的对应关系中进行匹配,以得到多个目标文件的目标文件格式;之后,根据多个目标文件的目标文件格式,从中间文件中获取多个目标文件分别对应的代码段和数据段。49.在本技术实施例中,不限定获取对应用的源代码进行编译的编译器标识的实施方式。在一些实施例中,可对编译器进行改进,如编译器可对应用的源代码进行编译,得到多个目标文件;并将编译器的标识封装于多个目标文件中。这样,后续可从多个目标文件中解析中携带的编译器的标识,作为对应用的源代码进行编译的编译器标识。50.在另一些实施例中,还可由技术人员设置当前对应用编译的编译器标识。可选地,可提供人机交互界面。该交互界面可包括编译器标识设置控件;技术人员可通过该控件,设置对应用编译的编译器标识。可选地,用户可触发编译器标识设置控件,选择编译器标识。对于计算机设备来说,可响应于针对编译器标识设置控件的交互操作,展示待选择的编译器标识;并响应于针对编译器标识的交互操作,确定该交互操作选定的编译器标识作为对应用编译的编译器标识等等。51.进一步,在对应用编译的编译器标识之后,可利用编译器标识在预设的编译器标识与目标文件格式之间的对应关系中进行匹配,以得到多个目标文件的目标文件格式;之后,根据多个目标文件的目标文件格式,从中间文件中获取多个目标文件分别对应的代码段和数据段。52.由于对多个目标文件进行链接可梳理出多个目标文件中各模块之间的相互引用关系,即链接关系;因此,在对多个目标文件的代码段和数据段分别进行合并处理时,可根据中间文件中代码段之间的链接关系,对多个目标文件的代码段进行合并处理,得到目标代码段;并根据中间文件中数据段之间的链接关系,对多个目标文件的数据段进行合并处理,得到目标数据段。53.在一些实施例中,也可直接对多个目标文件进行链接关系梳理,得到多个目标文件的代码段之间的链接关系以及数据段之间的链接关系,进一步,根据多个目标文件的代码段之间的链接关系,对多个目标文件的代码段进行合并处理,得到目标代码段;并多个目标文件的代码段之间的链接关系,对多个目标文件的数据段进行合并处理,得到目标数据段。54.其中,上述目标文件的数据段可包括:data段和bss(blockstartedbysymbol)段。bss段是指用来存放程序中未初始化的或者初始值为0的全局变量的一块内存区域,属于静态内存分配。data段是指用来存放程序中已初始化的全局变量的一块内存区域,属于静态内存分配。55.在本实施例中,在将多个目标文件的数据段进行合并处理时,针对先对多个目标文件进行链接,得到中间文件的实施例来说,可根据中间文件中data段之间的链接关系,将多个目标文件的data段合并处理,得到合并后的data段;并根据中间文件中bss段之间的链接关系,将多个目标文件的bss段合并处理,得到合并后的bss段。合并后的data段和合并后的bss段,构成目标数据段。56.由于对多个目标文件的代码段和数据段分别进行合并处理时,改变了代码段和数据段中的符号位置,基于此,在步骤103中,可根据目标代码段和所述目标数据段中的符号位置,修改多个目标文件对应的符号表和重定位表,以修改后的符号表和修改后的重定位表。在本技术实施例中,为了便于描述,将步骤103得到的修改后的符号表和修改后的重定位表,分别定义为第一符号表和第一重定位表。57.上述多个目标文件对应的符号表和重定位表是指包含有每个目标文件中的符号表和重定位表的符号表和重定位表。针对上述对多个目标文件进行链接,得到中间文件的实施例,在对多个目标文件进行链接时,还可对多个目标文件中的符号表和重定位表进行链接,得到一个符号表和一个重定位。链接后的符号表和重定位表包括:多个目标文件中的符号表和重定位表。在该实施例中,上述步骤103中多个目标文件对应的符号表和重定位表是指链接后的符号表和重定位表,即中间文件中的符号表和重定位表。58.针对直接对多个目标文件进行链接关系梳理的实施例,还可根据多个目标文件之间的链接关系,将多个目标文件中的重定位表和符号表合并为一个符号表和一个重定位表,上述步骤103中多个目标文件对应的符号表和重定位表是指对多个目标文件中的重定位表和符号表合并处理后的符号表和重定位表。59.进一步,考虑到对应用的可执行文件加载时,无需重定位的指令对应的符号,可直接执行,对于需要重定位的指令对应的符号,则需要基于重定位符号对应的符号表,对需要重定位的指令进行重定位,基于此,在步骤104中,可从第一符号表中,获取第一重定位表对应的第二符号表。可选地,可删除第一符号表中除第二符号表之外的其它符号表。60.可选地,可第一重定位表记录的符号之间的依赖关系,确定重定位符号依赖的符号;并从第一符号表中,获取第一重定位表记录的重定位符号及重定位符号依赖的符号对应的符号表,作为第二符号表。61.在得到目标代码段、目标数据段、第一重定位表及第一重定位表对应的第二符号表之后,在步骤105中,可根据目标代码段、目标数据段、第二符号表及第一重定位表,生成应用的可执行文件。62.可选地,可将第二符号表及第一重定位表复制至目标代码段和目标数据段所在的文件,得到应用的可执行文件。63.在本实施例中,在应用程序编译时,一方面,对应用源代码编译的多个目标文件的代码段和数据段进行合并处理,得到目标代码段和目标数据段,可减少表头信息,可减少表头的内存消耗;另一方面,仅保留应用加载时所需的重定位表对应的符号表,可减少符号表的空间消耗;因此,有助于减少后续根据目标代码段、目标数据段和重定位表及重定位表对应的符号表,生成的应用的可执行文件的大小,进而有助于降低加载应用时的内存消耗。64.另外,本实施例可将各种编译器生成的目标文件处理成具有统一格式的可执行文件,对于加载应用的计算机设备来说,可采用同一套代码实现对不同编译器生成的目标文件对应的可执行文件进行加载。65.在本技术实施例中,目标文件可包括:定义符号(definedsymbol)和未定义符号(undefinedsymbol)。定义符号通常指定义出的函数、全局变量等,为应用的开发者自定义的符号。未定义符号是指:类型(type)为未定义的符号,具体指目标文件所引用的,但其值未在目标文件中定义的符号。应用依赖的未定义符号可包括:应用直接依赖的未定义符号和间接依赖的未定义符号。应用直接依赖的未定义符号是指:应用的目标文件中包含的未定义符号。应用间接依赖的未定义符号是指:与应用的目标文件中包含的未定义符号关联的未定义符号。例如,与目标文件中包含的未定义符号存在关联关系的其它目标文件中的未定义符号等。66.计算机设备在加载应用时,对于定义符号对应的代码段,可根据定义符号的定义,确定定义符号对应的代码段的实际加载地址,而对于未定义符号对应的代码段的实际加载地址则需要重定位。基于此,在本实施例中,还可根据第一符号表记录的符号类型,确定应用依赖的未定义符号;并从多个目标文件对应的字串表中,获取未定义符号对应的字符串;之后,对未定义符号对应的字符串进行压缩处理,以得到处理后的字串表,有助于降低字符串的内存消耗。67.可选地,如图1b所示,可采用哈希(hash)算法对未定义符号对应的字符串进行压缩处理,得到处理后的字串表。例如,可采用哈希算法对未定义符号对应的字符串进行压缩处理为设定字节的数,如4字节数等。68.在本技术实施例中,由于定义符号对应的代码段,可根据定义符号的定义,确定定义符号对应的代码段的实际加载地址,因此,可未定义符号对应的字符串进行压缩处理,并删除定义符号对应的字符串,得到处理后的字串表。这样,一方面,对未定义符号对应的字符串进行压缩处理,可降低未定义符号对应的字符串的内存消耗;另一方面,删除不需要的定义符号对应的字符串,可进一步降低定义符号对应的字符串的内存消耗,进而降低后续可执行文件中的字串表的内存消耗,有助于进一步降低可执行文件的大小,进而有助于降低加载应用时的内存消耗。69.相应地,如图1b所示,在生成可执行文件时,还可将第一重定位表、第一重定位表对应的第二符号表、第一重定位表以及处理后的字串表复制至目标代码段和所述目标数据段所在的文件,得到应用的可执行文件。其中,图1b中以处理后的字串表为字符串哈希(hash)表进行图示,但不构成限定。70.这样,对于生成的可执行文件来说,一方面,对应用源代码编译的多个目标文件的代码段和数据段进行合并处理,得到目标代码段和目标数据段,可减少表头信息,可减少表头的内存消耗;另一方面,仅保留应用加载时所需的重定位表对应的符号表,可减少符号表的空间消耗;另外,对未定义符号对应的字符串进行压缩处理,可降低未定义符号对应的字符串的内存消耗;删除不需要的定义符号对应的字符串,可进一步降低定义符号对应的字符串的内存消耗。因此,本实施例可从多方面降低可执行文件中的字串表的内存消耗,有助于进一步降低可执行文件的大小,进而有助于降低加载应用时的内存消耗。71.对于加载该应用的计算机设备来说,由于加载应用时内存消耗较少,因此可提高计算机设备的应用加载速度。72.另外,对于rtos系统中使用的应用程序来说,本技术实施例提供的程序编译方法可实现应用单独编译,无需与rtos一起编译成一个可执行文件,可实现应用单独升级和加载。73.相应地,对于对应用进行编译的设备来说,在得到应用的可执行文件后,可发布该可执行文件。终端可加载可执行文件,实现对应用的加载。在本技术实施例中,终端可动态加载可执行文件,并运行可执行文件的代码逻辑。相应地,本技术实施例还提供程序加载方法。下面对本技术实施例提供的程序加载方法进行示例性说明。74.图2为本技术实施例提供的程序加载方法的流程示意图。如图2所示,该方法包括:75.201、获取应用的可执行文件。76.202、对可执行文件进行解析,以得到可执行文件包含的代码段、数据段、字串表、重定位表及重定位表对应的符号表。77.203、根据字串表、符号表及重定位表,对代码段中需要重定位的指令进行重定位。78.204、基于数据段,执行重定位后的指令及代码段中无需重定位的指令,以加载应用。79.在本实施例中,计算机设备可加载应用的可执行文件,运行可执行文件的代码逻辑,实现该应用对应的功能。例如,可加载可执行文件,播报天气、新闻、音乐或者实现其它功能等。80.为了实现可执行文件加载,在步骤201中,可获取应用的可执行文件;并在步骤202中,对可执行文件进行解析,得到可执行文件包含的代码段、数据段、字串表、重定位表及重定位表对应的符号表。81.可选地,在对可执行文件进行解析之前,还可检查可执行文件的合法性。可选地,可获取可执行文件的文件头格式;若可执行文件的文件头格式符合设定的文件头格式,则确定可执行文件通过合法性检查,进入上述步骤202中。若可执行文件的文件头格式不符合设定的文件头格式,则结束加载。82.在本实施例中,代码段主要是指上述应用编译得到的多个目标文件的代码段合并处理后的目标代码段;数据段主要是指上述应用编译得到的多个目标文件的数据段合并处理后的目标数据段。关于对多个目标文件的代码段和数据段的合并处理的具体实施方式,可参见上述实施例的相关内容,在此不再赘述。83.重定位表是指根据目标代码段和目标数据段的符号位置,修改多个目标文件对应的的重定位表所得到的上述第一重定位表;相应地,本实施例中,重定位表对应的符号表为上述第一重定位表对应的第二符号表。关于获取第二符号表的具体实施方式,可参见上述实施例的相关内容,在此不再赘述。84.进一步,在步骤203中,根据字串表、符号表及重定位表,对代码段中需要重定位的指令进行重定位;在步骤204中,基于内存中的数据点,执行重定位后的指令及代码段中无需重定位的指令,进而实现对应用的加载。85.在本实施例中,为了实现应用的动态加载,在步骤203之前,对于不支持芯片内执行(executeinplace,xip)的计算机设备来说,可将代码段、数据段、字串表、重定位表及符号表存储至内存中。86.可选地,可按照代码段、数据段、字串表、重定位表及符号表的总大小,申请内存;并将代码段、数据段、字串表、重定位表及符号表存储至申请到的内存中。87.相应地,在加载应用之后,还可释放代码段、字串表、重定位表及重定位表对应的符号表所占内存。88.对于支持xip的计算机设备来说,由于应用程序可以直接在flash闪存内运行,不必再把代码读到系统ram中,因此,在步骤203之前,可将数据段、字串表、重定位表及符号表存储至内存中;并将代码段存储至闪存中。89.可选地,可按照数据段、字串表、重定位表及符号表的总大小,申请内存;并将数据段、字串表、重定位表及符号表存储至申请到的内存中。90.相应地,在加载应用之后,还可释放字串表、重定位表及重定位表对应的符号表所占内存。91.在本实施例中,一方面,由于应用的可执行文件中的代码段和数据段是对应用源代码编译的多个目标文件的代码段和数据段进行合并处理得到的,可减少表头信息,进而可减少表头的内存消耗;另一方面,可执行文件中的符号表仅保留应用加载时所需的重定位表对应的符号表,可减少符号表的空间消耗;有助于进一步降低可执行文件的大小,进而终端在动态加载应用时可降低内存消耗。92.在本技术实施例中,为了进一步降低可执行文件的大小,还可对应用依赖的未定义符号的字符串进行压缩处理。关于对应用依赖的未定义符号的字符串进行压缩处理的具体实施方式,可参见上述实施例的相关内容,在此不再赘述。相应地,本实施例中,字串表包括对所述应用依赖的未定义符号的字符串压缩处理后的字符串。其中,对未定义符号的字符串压缩处理后的字符串可为1个或多个字符,其字符数量小于压缩处理前的字符数量。对于采用哈希算法对未定义符号的字符串进行压缩处理的实施方式,字串表可为字符串哈希表。93.基于上述对应用依赖的未定义符号的字符串压缩处理后的字符串构成的字串表,在对代码段中需要重定位的指令进行重定位时,可根据字串表记录的压缩处理后的字符串,通过操作系统查找未定义符号对应的代码段的实际加载地址。94.字串表(string-table)存储符号名称,如长度大于8字节的符号名称等。以符号名称为例,在目标文件中,符号所对应的结构体大小是固定的,可留出部分字节(如8字节等)存储符号名称。如果符号名称比较短,小于等于符号表用于存储符号名称的字节,则直接存储到符号表这个结构体中;如果符号名称长度大于符号表用于存储符号名称的字节,则把符号名称存到字串表(string-table)中,然后把该符号名称在字串表中的偏移地址记录到符号表用于存储符号名称的地方。在本实施例中,字串表存储的为未定义符号对应的压缩处理后的字符串,即对未定义符号的符号名称压缩处理后的字符串。基于此,在本实施例中,可根据符号表记录的未定义符号在字串表中的偏移地址,在字串表中确定未定义符号对应的压缩处理后的字符串,并根据字串表记录的压缩处理后的字符串,通过操作系统查找未定义符号对应的代码段的实际加载地址。95.进一步,可根据未定义符号对应的代码段的实际加载地址及符号表,创建新的符号表;并根据新的符号表及所述重定位表,对代码段中需要重定位的指令进行重定位。96.可选地,可根据未定义符号对应的代码段的实际加载地址,修改符号表记录的未定义符号对应的代码段的加载地址,以得到新的符号表。97.对于符号表来说,主要属性包括:符号名称和符号的偏移地址(相对地址)等。在本实施例中,可根据符号表中定义符号的名称,通过操作系统查找定义符号对应的代码段的实际加载地址;之后,根据未定义符号对应的代码段的实际加载地址及定义符号对应的代码段的实际加载地址,将符号表中未定位符号的偏移地址,修改为未定义符号对应的代码段的实际加载地址(即绝对地址),得到新的符号表。98.相应地,在对代码段中需要重定位的指令进行重定位时,可根据重定位表中的符号索引,确定重定位符号的名称;根据重定位符号的名称,查询新的符号表,以得到重定位符号对应的代码段的实际加载地址;之后,根据重定位表中的重定位类型,利用重定位符号对应的代码段的实际加载地址对代码段中需要重定位的指令进行重定位。99.其中,重定位表中的重定位类型可为绝对定位或相对定位。若重定位类型为绝对定位,则可利用重定位符号对应的代码段的实际加载地址加上代码段中需要重定位的指令的地址,得到需要重定位的指令的重定位地址。若重定位类型为相对定位,则可利用重定位符号对应的代码段的实际加载地址加上代码段中需要重定位的指令与该指令的下一指令的地址差值,得到需要重定位的指令的重定位地址。100.进一步,可基于内存中的数据段,执行重定位后的指令和代码段中不需要重定位的指令,实现应用加载。101.本实施例提供的程序加载方法,可适用于动态加载,也可适用于静态加载,尤其适用于单进程系统的动态加载。例如,单进程rtos系统运行过程中动态加载/卸载应用。102.需要说明的是,上述实施例所提供方法的各步骤的执行主体均可以是同一设备,或者,该方法也由不同设备作为执行主体。比如,步骤101和102的执行主体可以为设备a;又比如,步骤101的执行主体可以为设备a,步骤102的执行主体可以为设备b;等等。103.另外,在上述实施例及附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如101、102等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。104.相应地,本技术实施例还提供一种存储有计算机指令的计算机可读存储介质,当计算机指令被一个或多个处理器执行时,致使一个或多个处理器执行上述程序编译和/或程序加载方法中的步骤。105.本技术实施例还提供一种计算机程序产品,包括:计算机程序;计算机程序被处理器执行用于实现权利要求上述程序编译方法和/或程序加载方法。106.图3为本技术实施例提供的计算机设备的结构示意图。如图3所示,计算机设备可包括:存储器30a和处理器30b;其中,存储器30a,用于存储计算机程序。107.在一些实施例中,计算机设备为程序编译设备,如电脑等。相应地,处理器30b耦合至存储器30a,用于执行计算机程序以用于:获取应用的源代码编译得到的多个目标文件;对多个目标文件的代码段和数据段分别进行合并处理,以得到目标代码段和目标数据段;根据目标代码段和目标数据段中的符号位置,修改多个目标文件对应的符号表和重定位表,以得到第一符号表和第一重定位表;从第一符号表中,获取第一重定位表对应的第二符号表;并根据目标代码段、目标数据段、第二符号表及第一重定位表,生成应用的可执行文件。108.可选地,处理器30b还用于:在对多个目标文件的代码段和数据段分别进行合并处理之前,对多个目标文件进行链接,以得到应用的中间文件;并从中间文件中,获取多个目标文件分别对应的代码段和数据段。109.相应地,处理器30b在对多个目标文件的代码段和数据段分别进行合并处理时,具体用于:根据中间文件中代码段之间的链接关系,对多个目标文件的代码段进行合并处理,得到目标代码段;并根据中间文件中数据段之间的链接关系,对多个目标文件的数据段进行合并处理,得到目标数据段。110.可选地,处理器30b在从中间文件中获取多个目标文件分别对应的代码段和数据段时,具体用于:获取对应用的源代码进行编译的编译器标识;利用编译器标识在预设的编译器标识与目标文件格式之间的对应关系中进行匹配,以得到多个目标文件的目标文件格式;并根据多个目标文件的目标文件格式,从中间文件中获取多个目标文件分别对应的代码段和数据段。111.在一些实施例中,处理器30b在从第一符号表中获取第一重定位表对应的第二符号表时,具体用于:根据第一重定位表记录的符号之间的依赖关系,确定重定位符号依赖的符号;并从第一符号表中,获取第一重定位表记录的重定位符号及重定位符号依赖的符号对应的符号表,作为第二符号表。112.可选地,处理器30b还用于:根据第一符号表记录的符号类型,确定应用依赖的未定义符号;从多个目标文件对应的字串表中,获取未定义符号对应的字符串;对未定义符号对应的字符串进行压缩处理,以得到处理后的字串表。113.可选地,处理器30b在对未定义符号对应的字符串进行压缩处理时,具体用于:采用哈希算法对未定义符号对应的字符串进行压缩处理,以得到处理后的字串表。114.可选地,处理器30b在对未定义符号对应的字符串进行压缩处理时,具体用于:对未定义符号对应的字符串进行压缩处理,并删除定义符号对应的字符串,得到处理后的字串表。115.在另一些实施例中,处理器30b在生成应用的可执行文件时,具体用于:将第二符号表、第一重定位表以及处理后的字串表复制至目标代码段和目标数据段所在的文件,以得到应用的可执行文件。116.本实施例提供的计算机设备,在应用程序编译时,一方面,对应用源代码编译的多个目标文件的代码段和数据段进行合并处理,得到目标代码段和目标数据段,可减少表头信息;另一方面,仅保留应用加载时所需的重定位表对应的符号表,可减少符号表的空间消耗;因此,有助于减少后续根据目标代码段、目标数据段和重定位表及重定位表对应的符号表,生成的应用的可执行文件的大小,进而有助于降低加载应用时的内存消耗。117.在另一些实施例中,本实施例提供的计算机设备可实现为程序加载用设备,如智能终端设备。例如,智能手机、电脑、可穿戴设备或物联网设备等。其中,物联网设备可为智能音箱、智能电视、智能冰箱或者智能机器人等等,相应地,在该实施例中,处理器30b耦合至存储器30a,用于执行计算机程序以用于:获取应用的可执行文件;对可执行文件进行解arraylogic,pal)、通用阵列逻辑器件(generalarraylogic,gal)、复杂可编程逻辑器件(complexprogrammablelogicdevice,cpld)等可编程器件;或者为先进精简指令集(risc)处理器(advancedriscmachines,arm)或系统芯片(systemonchip,soc)等等,但不限于此。127.在本技术实施例中,通信组件被配置为便于其所在设备和其他设备之间有线或无线方式的通信。通信组件所在设备可以接入基于通信标准的无线网络,如wifi,2g或3g,4g,5g或它们的组合。在一个示例性实施例中,通信组件经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,所述通信组件还可基于近场通信(nfc)技术、射频识别(rfid)技术、红外数据协会(irda)技术、超宽带(uwb)技术、蓝牙(bt)技术或其他技术来实现。128.在本技术实施例中,显示组件可以包括液晶显示器(lcd)和触摸面板(tp)。如果显示组件包括触摸面板,显示组件可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。所述触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与所述触摸或滑动操作相关的持续时间和压力。129.在本技术实施例中,电源组件被配置为其所在设备的各种组件提供电力。电源组件可以包括电源管理系统,一个或多个电源,及其他与为电源组件所在设备生成、管理和分配电力相关联的组件。130.在本技术实施例中,音频组件可被配置为输出和/或输入音频信号。例如,音频组件包括一个麦克风(mic),当音频组件所在设备处于操作模式,如呼叫模式、记录模式和语音识别模式时,麦克风被配置为接收外部音频信号。所接收的音频信号可以被进一步存储在存储器或经由通信组件发送。在一些实施例中,音频组件还包括一个扬声器,用于输出音频信号。例如,对于具有语言交互功能的设备,可通过音频组件实现与用户的语音交互等。131.需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。132.本领域内的技术人员应明白,本技术的实施例可提供为方法、系统、或计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本技术可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。133.本技术是参照根据本技术实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。134.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。135.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。136.在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。137.内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。138.计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。139.还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。140.以上所述仅为本技术的实施例而已,并不用于限制本技术。对于本领域技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本技术的权利要求范围之内。当前第1页12当前第1页12
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献