实现程序加载运行的方法

文档序号:6538336阅读:109来源:国知局
专利名称:实现程序加载运行的方法
技术领域
本发明涉及计算机及通讯领域,尤其涉及一种实现程序加载运行的方法。
背景技术
计算机程序员采用高级语言,如C语言、C++语言等,编写计算机程序,然后通过计算机编译程序将高级语言编写的计算机程序编译成机器可执行的机器指令,用于完成某些功能。
程序由多个功能模块组成,计算机将多个高级语言编写的模块编译成机器语言,成为目标文件。当为了完成某项目标时,计算机将多个目标文件连接在一起组成程序文件。
有时由于一些功能模块较为常用,或者为了隔离某些功能模块,将某些功能模块提取出来作为库文件,如,windows操作系统中的DLL文件,Linux操作系统中的so文件。库文件在系统中独立存在,为一个或多个程序文件公用。
当系统运行程序文件的时候,首先检查出需要使用的库文件,然后将这些库文件进行动态连接,进而实现程序的加载运行。
与本发明相关的现有技术一采用动态连接技术实现程序加载运行。具体实施过程包括步骤一、分析程序使用了多少外部的库文件,确定使用了外部库文件中哪些符号,比如用到了哪些外部的库函数,库中的数据。
步骤二、从外部库文件的接口中获取信息,得到外部库文件中每个符号的地址信息。
步骤三、对程序文件进行处理,把使用到的外部库文件中每个符号的地址信息等内容填入程序的一些数据中。
步骤四、让程序真正运行。
由现有技术一可以看出,动态连接需要在每次程序运行之前执行连接过程,即步骤一至步骤三的过程,从而增加了开始运行的时间;而且动态连接需要额外内存空间进行地址信息的获取分析,增加了空间的消耗。
随着需要的外部库文件越多,连接过程的时间就越长,消耗的空间也就越大。尤其是在嵌入式的应用环境中,当空间和性能受到限制的时候,会导致整个系统响应时间慢,无法启动程序等问题。
与本发明相关的现有技术二采用静态连接技术实现程序加载运行。该方法将系统内所有模块形成的目标文件和外部的库文件连接到一起,形成一个程序文件加以运行。
现有技术二虽然在运行的时候不需要重新进行连接工作,但其无法使用外部的库文件,灵活性很差,如系统需要必须把各个模块放在一起,无法进行各个模块的隔离;修改一个模块则需要所有模块都进行连接等。而且如果有公用的模块被多个程序使用时,则需要拷贝公用的模块多次,这样会占用较多的运行空间和程序文件的存放空间,导致空间的浪费。

发明内容
鉴于上述现有技术所存在的问题,本发明的目的是提供一种实现程序加载运行的方法,该方法能够解决在性能、空间受到限制的系统中进行动态连接时系统模块加载的启动慢,空间需要大的问题;同时能够使用系统的外部库文件,能够实现功能模块的隔离。
本发明的目的是通过以下技术方案实现的本发明提供的一种实现程序加载运行的方法包括A、系统获取需预连接处理的外部库文件的信息;B、根据所述库文件的信息对编译产生的目标文件进行预连接处理,得到预连接处理后的程序文件;C、根据所述预连接处理后的程序文件实现程序的加载运行。
其中,所述步骤B具体包括B1、将外部库文件的信息进行处理;B2、根据处理后的外部库文件的信息将目标文件进行预连接的转换,形成预连接处理后的程序文件。
其中,所述步骤B1具体包括B11、将外部库文件的信息进行收集;B12、将收集后的外部库文件的信息整理到配置信息文件中或放在预处理程序的内存数据中。
其中,所述步骤B2具体包括B21、将所述配置信息文件中的信息添加到目标文件的程序代码和数据对应使用的外部库的位置;B22、将添加所述配置信息文件信息后的所述目标文件转换成预连接处理后的程序文件。
其中,所述步骤C具体包括C1、系统读取预连接处理后的程序文件,通过所述文件中的外部库信息,判断外部库文件是否已经放入系统内存中,若已经放入系统内存,则转入步骤C3;如果未放入系统内存,则执行步骤C2;C2、加载需要的外部库文件和程序;
C3、将预连接程序文件的程序代码和数据放入对应的内存,进行数据初始化;C4、在程序起始运行点运行所述程序代码。
其中,所述步骤A具体包括A1、获取编译产生的相应目标文件;A2、分析所述目标文件,得到需预连接处理的外部库文件的信息。
其中,所述步骤A2具体包括A21、分析编译产生的目标文件的文件头;A22、根据所述文件头查找对应的段节表;A23、根据所述段节表查找描述外部库文件信息的段节;A24、根据所述段节的内容获取程序使用的外部库文件的信息。
其中,所述步骤B2还包括B23、将预连接处理后的程序文件和配置文件中的外部库的信息保存到特殊文件中;或,B24、将预连接处理后的程序文件和配置文件中的外部库信息保存到系统内存中;其中,在所述步骤C1之前还包括C0、根据所述特殊文件格式识别需要动态连接的程序文件和进行过预连接处理的程序文件。
其中,所述特殊文件包括标识预处理连接程序的特征字符串、外部库信息和文件后缀名并可选的包括连接信息区;其中,所述步骤C0具体包括根据特殊文件后缀名和预连接程序格式开始的特征字符串识别需要动态连接的程序文件和进行过预连接处理的程序文件。
其中,所述配置信息文件的信息包括
外部库文件的名称和符号的地址信息,并可选的包括外部库文件的版本和说明信息。
由上述本发明提供的技术方案可以看出,本发明所述的方法通过在程序加载运行前,预先解决程序使用外部库文件的连接问题,所以能够解决现有技术一中动态连接时引起的空间与时间浪费的问题,而且能够解决现有技术二中静态连接时不能作到灵活使用系统的外部库文件,不能对功能模块进行隔离的问题。


图1为本发明的流程图;图2为现有技术中ELF程序文件格式的结构图。
具体实施例方式
本发明提供了一种实现程序加载运行的方法,当程序需要使用外部库文件的时候,通过预先获取外部库的符号地址等信息,对编译完成的程序文件进行预连接处理,但是不直接包含外部库。
本发明相对动态连接技术,在运行之前就做好目标文件与外部库文件的连接处理工作,减少了系统程序加载运行的空间,减少了运行时间,提高了程序加载运行的效率。
本发明不需要把外部库文件直接放入程序文件,所以能够完成功能模块的隔离,能够实现公用模块的重用,从而能够提高系统的灵活性。
本发明系统首先获取需预连接处理的外部库文件的信息;然后根据所述库文件的信息对编译产生的目标文件进行预连接处理,得到预连接处理后的程序文件;最后系统根据所述预连接处理后的程序文件实现程序的加载运行。
具体实施过程如图1所示,包括步骤S101,根据处理的需要获取编译产生的相应目标文件。
由于计算机系统中可执行的目标文件格式很多,如ELF目标文件格式、EXE目标文件格式等。在目标文件格式中往往描述了程序运行时的一些信息。以ELF目标文件格式为例,描述了下述内容1、程序运行时,在内存中占有的位置。
2、程序运行时,代码、数据和堆栈等部分占用的空间。
3、程序是否用到了外部的库文件,如果使用了外部的库文件,可执行程序中需要描述本程序使用外部库文件的情况,即包括但不限于本程序在何处使用了外部库文件的哪一个符号,多次使用需要有多次描述;本程序使用了哪些外部库文件,使用的每个外部符号属于哪些外部库文件。
系统根据处理的需要选取编译产生后的相应目标文件,如某个编译成为ELF格式的程序文件。
当系统选取好要处理的目标文件后,然后执行步骤S102,即分析所述目标文件,得到需预连接处理的外部库文件的信息。具体包括步骤一,分析编译产生的目标文件的文件头;步骤二,根据所述文件头查找对应的段节表;步骤三,根据所述段节表查找描述外部库文件信息的段节;步骤四,根据所述段节的内容获取程序使用的外部库文件的信息,如外部库文件的名称、被用到的外部库符号的信息和外部库文件的版本及说明信息等。
下面描述以可执行目标文件格式-ELF格式为例说明怎样进行分析并通过分析得到需预连接处理的外部库文件的信息的过程。
如图2所示,ELF程序文件格式包括ELF文件头、程序头、分段表、段节表和段节内容等。所述文件头具有一定的结构,用于描述段节表在文件中的位置,同样段节表也会描述不同的段节在文件中的位置。
本发明系统预连接处理程序使用的外部库的信息存放在一些特定类型的段节之中。当系统选取好要处理的ELF目标文件后,首先分析ELF文件头,找到对应的段节表,然后根据段节表找到特定的描述外部引用库文件信息的段节。最后根据所述段节中的内容来获得本程序使用外部库文件的信息情况。
步骤S103,将外部库文件的信息进行处理。
在这一过程中,首先将外部库文件的信息进行收集;然后将所述外部库文件的信息按照一定的文件格式输入到具有一定格式的配置信息文件中,或将这些信息放在预处理程序的内存数据中,以便供后面的预处理程序使用。
在一般嵌入式或者有固定用途的系统设备中,系统每次使用的外部库的种类和内容一致;在较小的系统设备中,每次使用的库也一样。在这种情况下,可以从系统设备中直接获取外部库的位置、符号信息等信息,然后交给预连接程序,提前完成连接工作。为了避免外部库有变更,还需要记录各个外部库文件的版本等信息。
在形成配置信息文件时,输入的文件格式如表一所示,包括外部库文件的名称、库文件的版本和说明信息、符号的地址信息以及外部库文件的版本信息等。

表一根据上面过程获取本程序使用外部库的信息,以及外部库的符号信息后,系统就可以在本程序代码和数据对应的使用外部库的位置添上真正的外部库文件的符号信息(地址),形成预连接处理后的程序文件。具体实施过程如下步骤S104,根据所述配置信息文件的信息将目标文件进行预连接的转换,形成预连接处理后的程序文件。
具体实施过程步骤一,将收集并整理后的配置信息文件中的外部库文件的符号信息添加到目标文件的预连接处理程序的程序代码和数据对应使用的外部库的位置;步骤二,将添加所述配置信息文件信息后的所述目标文件转换成预连接处理后的程序文件。
步骤三,将预连接处理后的程序文件和配置信息文件的外部库描述信息保存到特殊文件中,形成特有的预连接格式的文件,或者直接将预连接处理后的程序文件和配置信息文件的外部库描述信息放入内存数据中。
如表二所示,所述特殊文件存放标识预处理连接程序文件的特征字符串、外部库文件的信息、预连接处理过的程序代码、文件后缀名和连接信息区等,以备系统程序加载运行时使用。
表二经过上述步骤后,形成了包含预连接处理后的程序代码的程序文件,然后系统根据所述预连接处理后的程序文件实现程序的加载运行。具体实施过程包括步骤S105,根据所述特殊文件识别需要动态连接的程序文件和进行过预连接处理的程序文件。
因为预连接处理后的文件后缀名以及预连接程序格式开始的特征字符串有别于其它需动态连接的程序文件,所以根据所述文件后缀名以及所述特征字符串可以很方便地识别需要动态连接的程序文件和进行预连接处理后的程序文件。
步骤S106,读取预连接处理后的程序文件,通过所述特殊文件中的外部库信息,判断外部库文件是否已经放入系统内存中,若已经放入系统内存,则执行步骤S108;如果未放入系统内存,则执行步骤S107;步骤S107,加载需要的外部库文件和程序;步骤S108,将预连接程序文件的代码和数据放入对应的内存,进行数据初始化,比如数据空间分配等工作;步骤S109,转入程序起始运行点运行程序。
当程序加载运行的过程中,不需要重新进行外部数据库文件的连接,仅仅需要核对系统需要的外部库文件的信息即可,从而节省了大量用于连接和处理的时间和消费的系统内存空间,提高了性能。同时本发明也能够灵活访问外部的库,提供了较好的灵活性。在应用环境单一的系统(嵌入式系统)中表现较为突出。
以上所述,仅为本发明较佳的具体实施方式
,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
权利要求
1.一种实现程序加载运行的方法,其特征在于,包括A、系统获取需预连接处理的外部库文件的信息;B、根据所述库文件的信息对编译产生的目标文件进行预连接处理,得到预连接处理后的程序文件;C、根据所述预连接处理后的程序文件实现程序的加载运行。
2.根据权利要求1所述的方法,其特征在于,所述步骤B具体包括B1、将外部库文件的信息进行处理;B2、根据处理后的外部库文件的信息将目标文件进行预连接的转换,形成预连接处理后的程序文件。
3.根据权利要求2所述的方法,其特征在于,所述步骤B1具体包括B11、将外部库文件的信息进行收集;B12、将收集后的外部库文件的信息整理到配置信息文件中或放在预处理程序的内存数据中。
4.根据权利要求2所述的方法,其特征在于,所述步骤B2具体包括B21、将所述配置信息文件中的信息添加到目标文件的程序代码和数据对应使用的外部库的位置;B22、将添加所述配置信息文件信息后的所述目标文件转换成预连接处理后的程序文件。
5.根据权利要求3或4所述的方法,其特征在于,所述步骤C具体包括C1、系统读取预连接处理后的程序文件,通过所述文件中的外部库信息,判断外部库文件是否已经放入系统内存中,若已经放入系统内存,则转入步骤C3;如果未放入系统内存,则执行步骤C2;C2、加载需要的外部库文件和程序;C3、将预连接程序文件的程序代码和数据放入对应的内存,进行数据初始化;C4、在程序起始运行点运行所述程序代码。
6.根据权利要求5所述的方法,其特征在于,所述步骤A具体包括A1、获取编译产生的相应目标文件;A2、分析所述目标文件,得到需预连接处理的外部库文件的信息。
7.根据权利要求6所述的方法,其特征在于,所述步骤A2具体包括A21、分析编译产生的目标文件的文件头;A22、根据所述文件头查找对应的段节表;A23、根据所述段节表查找描述外部库文件信息的段节;A24、根据所述段节的内容获取程序使用的外部库文件的信息。
8.根据权利要求7所述的方法,其特征在于,所述步骤B2还包括B23、将预连接处理后的程序文件和配置文件中的外部库的信息保存到特殊文件中;或,B24、将预连接处理后的程序文件和配置文件中的外部库信息保存到系统内存中;在所述步骤C1之前还包括C0、根据所述特殊文件格式识别需要动态连接的程序文件和进行过预连接处理的程序文件。
9.根据权利要求8所述的方法,其特征在于,所述特殊文件包括标识预处理连接程序的特征字符串、外部库信息和文件后缀名并可选地包括连接信息区;所述步骤C0具体包括根据特殊文件后缀名和预连接程序格式开始的特征字符串识别需要动态连接的程序文件和进行过预连接处理的程序文件。
10.根据权利要求9所述的方法,其特征在于,所述配置信息文件的信息包括外部库文件的名称和符号的地址信息,并可选地包括外部库文件的版本和说明信息。
全文摘要
本发明涉及一种实现程序加载运行的方法,该方法的核心是首先系统获取需预连接处理的外部库文件的信息;其次,根据所述库文件的信息对编译产生的目标文件进行预连接处理,得到预连接处理后的程序文件;最后根据所述预连接处理后的程序文件实现程序的加载运行。通过本发明不仅能够解决现有技术动态连接时引起的空间与时间浪费的问题,而且能够解决静态连接时不能作到灵活使用系统的外部库文件,不能对功能模块进行隔离的问题。
文档编号G06F9/445GK1834911SQ200510053858
公开日2006年9月20日 申请日期2005年3月14日 优先权日2005年3月14日
发明者任蔚 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1