CN1834911A - 实现程序加载运行的方法 - Google Patents
实现程序加载运行的方法 Download PDFInfo
- Publication number
- CN1834911A CN1834911A CN 200510053858 CN200510053858A CN1834911A CN 1834911 A CN1834911 A CN 1834911A CN 200510053858 CN200510053858 CN 200510053858 CN 200510053858 A CN200510053858 A CN 200510053858A CN 1834911 A CN1834911 A CN 1834911A
- Authority
- CN
- China
- Prior art keywords
- file
- program
- information
- connection
- external libraries
- 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.)
- Granted
Links
Landscapes
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及一种实现程序加载运行的方法,该方法的核心是:首先系统获取需预连接处理的外部库文件的信息;其次,根据所述库文件的信息对编译产生的目标文件进行预连接处理,得到预连接处理后的程序文件;最后根据所述预连接处理后的程序文件实现程序的加载运行。通过本发明不仅能够解决现有技术动态连接时引起的空间与时间浪费的问题,而且能够解决静态连接时不能作到灵活使用系统的外部库文件,不能对功能模块进行隔离的问题。
Description
技术领域
本发明涉及计算机及通讯领域,尤其涉及一种实现程序加载运行的方法。
背景技术
计算机程序员采用高级语言,如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,将外部库文件的信息进行处理。
在这一过程中,首先将外部库文件的信息进行收集;然后将所述外部库文件的信息按照一定的文件格式输入到具有一定格式的配置信息文件中,或将这些信息放在预处理程序的内存数据中,以便供后面的预处理程序使用。
在一般嵌入式或者有固定用途的系统设备中,系统每次使用的外部库的种类和内容一致;在较小的系统设备中,每次使用的库也一样。在这种情况下,可以从系统设备中直接获取外部库的位置、符号信息等信息,然后交给预连接程序,提前完成连接工作。为了避免外部库有变更,还需要记录各个外部库文件的版本等信息。
在形成配置信息文件时,输入的文件格式如表一所示,包括:外部库文件的名称、库文件的版本和说明信息、符号的地址信息以及外部库文件的版本信息等。
[外部库1名称] |
库的版本和说明信息 |
符号1 符号1的地址信息 |
符号2 符号2的地址信息 |
符号3 符号3的地址信息 |
… |
[外部库2名称] |
库的版本和说明信息 |
符号1 符号1的地址信息 |
… |
表一
根据上面过程获取本程序使用外部库的信息,以及外部库的符号信息后,系统就可以在本程序代码和数据对应的使用外部库的位置添上真正的外部库文件的符号信息(地址),形成预连接处理后的程序文件。具体实施过程如下:
步骤S104,根据所述配置信息文件的信息将目标文件进行预连接的转换,形成预连接处理后的程序文件。
具体实施过程:
步骤一,将收集并整理后的配置信息文件中的外部库文件的符号信息添加到目标文件的预连接处理程序的程序代码和数据对应使用的外部库的位置;
步骤二,将添加所述配置信息文件信息后的所述目标文件转换成预连接处理后的程序文件。
步骤三,将预连接处理后的程序文件和配置信息文件的外部库描述信息保存到特殊文件中,形成特有的预连接格式的文件,或者直接将预连接处理后的程序文件和配置信息文件的外部库描述信息放入内存数据中。
如表二所示,所述特殊文件存放标识预处理连接程序文件的特征字符串、外部库文件的信息、预连接处理过的程序代码、文件后缀名和连接信息区等,以备系统程序加载运行时使用。
表二
经过上述步骤后,形成了包含预连接处理后的程序代码的程序文件,然后系统根据所述预连接处理后的程序文件实现程序的加载运行。具体实施过程包括:
步骤S105,根据所述特殊文件识别需要动态连接的程序文件和进行过预连接处理的程序文件。
因为预连接处理后的文件后缀名以及预连接程序格式开始的特征字符串有别于其它需动态连接的程序文件,所以根据所述文件后缀名以及所述特征字符串可以很方便地识别需要动态连接的程序文件和进行预连接处理后的程序文件。
步骤S106,读取预连接处理后的程序文件,通过所述特殊文件中的外部库信息,判断外部库文件是否已经放入系统内存中,若已经放入系统内存,则执行步骤S108;如果未放入系统内存,则执行步骤S107;
步骤S107,加载需要的外部库文件和程序;
步骤S108,将预连接程序文件的代码和数据放入对应的内存,进行数据初始化,比如数据空间分配等工作;
步骤S109,转入程序起始运行点运行程序。
当程序加载运行的过程中,不需要重新进行外部数据库文件的连接,仅仅需要核对系统需要的外部库文件的信息即可,从而节省了大量用于连接和处理的时间和消费的系统内存空间,提高了性能。同时本发明也能够灵活访问外部的库,提供了较好的灵活性。在应用环境单一的系统(嵌入式系统)中表现较为突出。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (10)
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所述的方法,其特征在于,所述配置信息文件的信息包括:
外部库文件的名称和符号的地址信息,并可选地包括外部库文件的版本和说明信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2005100538585A CN1834911B (zh) | 2005-03-14 | 2005-03-14 | 实现程序加载运行的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2005100538585A CN1834911B (zh) | 2005-03-14 | 2005-03-14 | 实现程序加载运行的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1834911A true CN1834911A (zh) | 2006-09-20 |
CN1834911B CN1834911B (zh) | 2010-04-28 |
Family
ID=37002676
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2005100538585A Expired - Fee Related CN1834911B (zh) | 2005-03-14 | 2005-03-14 | 实现程序加载运行的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1834911B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101833464A (zh) * | 2010-04-16 | 2010-09-15 | 深圳市五巨科技有限公司 | 一种移动终端分段加载应用程序的方法及装置 |
CN102270158A (zh) * | 2011-08-10 | 2011-12-07 | 深圳市万兴软件有限公司 | 一种应用程序多进程运行方法及装置 |
CN105094878A (zh) * | 2014-05-22 | 2015-11-25 | 阿里巴巴集团控股有限公司 | 一种集成系统库文件的方法和装置 |
CN107291513A (zh) * | 2017-07-04 | 2017-10-24 | 武汉斗鱼网络科技有限公司 | 文件加载方法及装置、计算机可读存储介质 |
CN111090854A (zh) * | 2019-11-25 | 2020-05-01 | 上海达梦数据库有限公司 | 目标程序的执行与转换方法、装置、终端和存储介质 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1225691C (zh) * | 2002-07-08 | 2005-11-02 | 华为技术有限公司 | 一种程序动态加载方法 |
CN1474269A (zh) * | 2002-08-08 | 2004-02-11 | 力捷电脑股份有限公司 | 程序模块加载系统的方法 |
DE10323033A1 (de) * | 2003-05-20 | 2004-12-23 | Giesecke & Devrient Gmbh | Laden eines ausführbaren Programms in einen tragbaren Datenträger |
-
2005
- 2005-03-14 CN CN2005100538585A patent/CN1834911B/zh not_active Expired - Fee Related
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101833464A (zh) * | 2010-04-16 | 2010-09-15 | 深圳市五巨科技有限公司 | 一种移动终端分段加载应用程序的方法及装置 |
CN102270158A (zh) * | 2011-08-10 | 2011-12-07 | 深圳市万兴软件有限公司 | 一种应用程序多进程运行方法及装置 |
CN105094878A (zh) * | 2014-05-22 | 2015-11-25 | 阿里巴巴集团控股有限公司 | 一种集成系统库文件的方法和装置 |
CN105094878B (zh) * | 2014-05-22 | 2019-02-22 | 阿里巴巴集团控股有限公司 | 一种集成系统库文件的方法和装置 |
CN107291513A (zh) * | 2017-07-04 | 2017-10-24 | 武汉斗鱼网络科技有限公司 | 文件加载方法及装置、计算机可读存储介质 |
CN107291513B (zh) * | 2017-07-04 | 2020-07-31 | 武汉斗鱼网络科技有限公司 | 文件加载方法及装置、计算机可读存储介质 |
CN111090854A (zh) * | 2019-11-25 | 2020-05-01 | 上海达梦数据库有限公司 | 目标程序的执行与转换方法、装置、终端和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN1834911B (zh) | 2010-04-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1294486C (zh) | 多重处理环境中透明动态优化的方法和系统 | |
CN1178134C (zh) | 执行于板上系统内的中间对象代码程序的数据压缩方法 | |
CN1752934A (zh) | 编译器、编译方法以及编译程序 | |
CN1851667A (zh) | 一种图形用户界面的测试方法和系统 | |
CN1834911A (zh) | 实现程序加载运行的方法 | |
CN1767453A (zh) | 自动测试方法和系统 | |
CN1504881A (zh) | 爪哇执行设备和爪哇执行方法 | |
CN1641587A (zh) | 用于改进爪哇虚拟机性能的方法和系统 | |
CN1601476A (zh) | 用于smt处理器上的cpi调度的系统和方法 | |
CN1858704A (zh) | 升级程序的方法 | |
CN1959640A (zh) | 在软件包管理系统将用户进程表示为软件包的系统和方法 | |
CN101042645A (zh) | 统一软件开发环境的方法、设备及系统 | |
CN1855053A (zh) | 用于执行java虚拟机的指令的方法和设备 | |
CN1313927C (zh) | 智能卡运行环境的控制方法 | |
CN1855032A (zh) | 微处理系统、总线地址转换方法以及程序修补方法 | |
CN1367895A (zh) | 把不同源语言转移到一个执行介质 | |
CN1949169A (zh) | 电视机软件升级方法 | |
CN1514353A (zh) | 基于动态内核实现跨地址空间创建构件对象的方法 | |
CN1313925C (zh) | 构件自描述封装方法及运行的方法 | |
CN1710547A (zh) | 软件测试方法及其系统 | |
CN101055542A (zh) | 一种交叉集成开发环境中的符号调试方法及系统 | |
CN1900910A (zh) | 二进制翻译中经由跳转表的多目标分支语句的识别方法 | |
CN1879067A (zh) | 匹配用于控制工作过程的函数的方法和装置 | |
CN1295778C (zh) | 一种验证芯片硬件行为与软件模拟行为的一致性的方法 | |
CN1949175A (zh) | 一种对软件中的数据进行替换的方法 |
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 | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20100428 Termination date: 20180314 |
|
CF01 | Termination of patent right due to non-payment of annual fee |