一种程序链接方法及装置的制作方法

文档序号:6576028阅读:222来源:国知局
专利名称:一种程序链接方法及装置的制作方法
技术领域
本发明涉及通信及计算机技术领域,具体涉及一种程序链接方法及装置。
背景技术
在计算机、通信、IT等领域,很多硬件系统完成后都需要安装OS(Operation System,操作系统)、硬件驱动和相关应用程序等软件。这些软件最初由汇编语言或高级语 言(如C语言、Java语言等)编写而成,以源代码的形式存在,要想让其在相关硬件上运行, 还需要经过编译、链接等过程生成最终可在硬件上运行的二进制程序。
将源代码编译、链接后生成二进制程序的方法有多种,按链接方式的不同,一般采 用静态链接方式或采用静态链接结合动态链接方式。以软件系统包括0S和硬件驱动为例 来对这两种方式进行具体说明
1.静态链接方式 见图l,将OS的源代码(OSFilel. c等文件)和硬件驱动源代码(DrvFilel. c等文 件)分别编译后一起进行静态链接,生成可运行的二进制程序SRP.bin, SRP.bin可以在配 套的硬件上直接运行,并驱动所有硬件设备。
2.采用静态链接结合动态链接方式 参见图2,首先将0S核心组件的源代码(OSCore. c等文件)与核心硬件驱动源代
码(DrvCore. c等文件)编译并静态链接生成可执行的二进制文件。其它OS组件源代码
(0SFilel.c)和硬件驱动源代码(DrvFilel.c等文件)分别编译后生成动态链接库,在OS
启动后,动态加载并链接这些动态链接库,即可使用。 发明人在实现本发明过程中,发现现有技术至少存在如下缺点 在由多个软件子系统组成的软件系统(如包括OS和驱动程序)中,当其中一个或
多个软件子系统升级时,其它软件子系统需重新编译和升级,使得升级过程更加繁琐复杂。

发明内容
本发明实施例提供一种程序链接方法及装置,用于重新链接多个程序,使得在由
多个软件子系统组成的软件系统,当其中一个或多个软件子系统升级时,其它软件子系统 可以无需重新编译和升级 本发明实施例提供一种程序链接方法,包括通过解析第一程序和第二程序,获取
所述第一程序引用所述第二程序中的第一符号,以及获取所述第一符号在所述第一程序中
的第一地址和所述第一符号在第二程序中的第二地址;所述第一符号包括函数和/或变 量;根据所述第一地址和所述第二地址,对所述第一符号进行重定向。 本发明实施例还提供了一种程序链接装置,包括解析单元用于通过解析第一程 序和第二程序,获取所述第一程序引用所述第二程序中的第一符号,以及获取所述第一符 号在所述第一程序中的第一地址和所述第一符号在第二程序中的第二地址;重定向单元, 用于根据所述第一地址和所述第二地址,对所述第一符号进行重定向。
上述技术方案中具有如下优点 在由多个软件子系统组成的软件系统,当其中一个或多个软件子系统升级时,其它软件子系统可以无需重新编译和升级。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术通过静态链接生成二进制程序的示意图; 图2为现有技术通过静态链接结合动态链接生成二进制程序的示意图; 图3为本发明实施例程序链接技术示意图; 图4为本发明实施例通过符号表地址查找符号表示意图; 图5为本发明实施例通过符号表索引地址查找符号表示意图; 图6为本发明实施例通过符号表特征码查找符号表示意图; 图7为本发明实施例对函数进行重定向示意图; 图8为本发明实施例程序链接装置示意图。
具体实施例方式
为使本发明的目的、技术方案及优点更加清楚明白,以下将通过具体实施例和相关附图,对本发明作进一步详细说明。 本发明实施例一提供一种程序链接方法,包括如下步骤 通过解析第一程序和第二程序,获取所述第一程序引用所述第二程序中的第一符
号,以及获取所述第一符号在所述第一程序中的第一地址和所述第一符号在第二程序中的
第二地址;根据所述第一地址和所述第二地址,对所述第一符号进行重定向。 通过本发明实施例一种程序链接方法,使得在由多个软件子系统组成的软件系
统,当其中一个或多个软件子系统升级时,其它软件子系统可以无需重新编译和升级。 本发明实施例二提供一种程序链接方法,包括如下步骤 通过解析第一程序和第二程序,获取所述第一程序引用所述第二程序中的第一符
号,以及获取所述第一符号在所述第一程序中的第一地址和所述第一符号在第二程序中的
第二地址;根据所述第一地址和所述第二地址,对所述第一符号进行重定向。 其中,第一程序由第一源代码和第二虚拟源代码编译并静态链接生成,所述第二
虚拟源代码为所述第一源代码提供需要引用的函数和/或变量。 获得相关符号的第一地址和第二地址的方法可以通过查找符号表来获取,符号表可以通过查找符号表地址、查找符号表索引地址和查找符号表特征码的方式获得。
获得符号的第一地址和第二地址后可以对符号进行重定向 当第一符号为函数时,查找第一程序的符号表和第二程序的符号表,找到第一程序引用第二程序的函数在第一程序和所述第二程序中的具体地址;修改第一程序中函数的第一条指令为跳转到第二程序中的函数的跳转指令;
当第一符号为变量时,修改第一程序引用第二程序中变量的指令中的变量地址为变量在所述第二程序中的地址;或者保持第一程序引用第二程序中变量的指令中的变量地址不变。 本发明实施例程序链接方法还可以进一步包括如下步骤 通过解析第一程序和第二程序,获取第二程序引用第一程序中的第二符号,以及获取第二符号在第一程序中的第三地址和所述第二符号在第二程序中的第四地址;根据第三地址和第四地址,对第二符号进行重定向;对第二符号进行重定向的过程与对第一符号进行重定向的过程类似。 通过本发明实施例,使得在由多个软件子系统组成的软件系统,当其中一个或多
个软件子系统升级时,其它软件子系统可以无需重新编译和升级。 本发明实施例三 下面通过具体的单板系统中的程序链接方法来对本发明实施例三一种程序链接进行详细说明 参见图3,以软件系统的子系统包括OS和硬件驱动为例,来对本发明实施例进行说明 S301、将关联的操作系统源代码OSSrc. c和硬件驱动源代码Drv. c分别进行编译并静态链接生成对应的程序0S1. bin以及DRV1. bin,且生成的程序为二进制程序。
所述操作系统编译生成的0S1. bin可以存储在硬盘或者远程服务器;所述驱动软件编译生成DRV1. bin可以存储与单板内置的FLASH中。 参见图3, OSSrc. c为OS的源代码,由于OS源代码中引用了硬件驱动函数和/或变量,因此,OS源代码单独编译后是无法完成静态链接的。为了使得OS源代码编译后能够完成静态链接,可以引入一个虚拟驱动子系统(假设其源代码为virtualDrv. c),该虚拟驱动子系统提供了OS需要引用的驱动函数(可以为空函数)和/或变量。OS与虚拟驱动编译并静态链接后生成二进制程序0S1. bin,但是因为虚拟驱动并不是真实的驱动,因此,生成的二进制程序可能无法在某个具体硬件上运行。 同理,真实的硬件驱动(假设其源代码为Drv.c)因为使用了一些OS的函数和/
或变量,其源代码编译后也无法独立完成静态链接,这时可以引入一个虚拟OS子系统(假
设其源代码为virtualOS. c),虚拟OS子系统中包含了硬件驱动使用的所有函数和/或变量
定义。硬件驱动与虚拟OS编译并静态链接后生成二进制程序DRV1. bin。 由于二进制程序0S1. bin需要真实的驱动函数和/或变量,二进制程序DRV1. bin
需要真实的OS函数和/或变量,因此这两个二进制程序都不能在某个具体硬件上直接运行。 为了使这两个二进制程序可以在具体硬件上直接运行,需要对这两个二进制程序进行重新链接,即将虚拟OS和虚拟驱动中的函数和/或变量进行重定向。通过重新链接技术,生成的新的二进制程序OS. bin和DRV. bin可以在真实的硬件上执行。如果要在不同的硬件上执行,只需要对0S1. bin与不同的DRVn. bin (DRVn表示区别于DRV1. bin的驱动)进行重新链接即可。具体包括OSl. bin中引用DRV1. bin的函数和/或变量重新链接到DRV1.bin,以及DRV1. bin引用0S1. bin的函数和/或变量重新链接到0S1. bin。
S302、解析0S1. bin和DRV1. bin ;
通过解析OSl.bin获取OSl.bin引用DRV1. bin的符号以及这些符号在0S1. bin和DRVl.bin中的地址。 单板从BIOS启动后,先将DRV1. bin从FLASH复制到内存,然后从硬盘或者远程服务器将0S1. bin加载到内存,通过获取0S1. bin引用DRV1. bin的符号以及这些符号在0S1.bin和DRV1. bin中的地址来完成对0S1. bin和DRV1. bin的重新链接。在重新链接过程中,需要通过解析0S1. bin和DRV1. bin得到具有引用关系的符号,以及这些符号在0S1. bin和DRVl.bin中的地址。 0S1. bin引用DRV1. bin的符号信息存放在0S1. bin —块存储区域;符号在0S1.bin和DRV1. bin中的地址分别存放在0S1. bin和DRV1. bin的符号表(SymTbl)当中,可以通过找到符号表来获取符号在0S1. bin和DRV1. bin中的地址。 寻找符号表可以通过查找符号表地址、查找符号表索引地址或查找符号表特征码等方法来实现;与之类似,获取0S1. bin引用DRV1. bin的符号信息的存储区域也可以通过类似方法得到。 下面对寻找符号表方法进行具体说明 符号表位于二进制程序当中,存储着符号名称、类型和地址之间的关系,这里的符号一般包括函数、变量等。为了找到需要重新链接的符号对应的地址,可以通过反向工程来解析符号表,下文以利用编译规则为例来具体说明如何解析符号表 源代码在编译链接的过程中,由于编译规则的不同(如使用不同编译器或不同的编译器参数),生成的二进制程序中符号表的位置也不相同,为了解析符号表中的符号,首先需要找到符号表地址(即符号表入口地址),包括但不限于以下几个方法
A.通过符号表地址 在一些编译规则下,符号表地址在二进制程序中的位置是固定的。参见图x,为利用符号表地址固定的特性来寻找符号表地址的示意图。以在OSl.bin中寻找符号表地址为例,假设0S1. bin占用从0x0000到0x1000的存储地址,在0S1. bin中,符号表地址固定,始终为地址0x0100 (实际中可能为其它的固定值),以后这类二进制程序的符号表地址都可以通过固定地址0x0100来寻找。
B.通过符号表索引地址 在一些编译规则下,符号表的真实地址是不固定的,但是符号表索引地址却是固定的。参见图x,为利用符号表索引地址固定的特性来寻找符号表地址的示意图。同样以在0S1. bin中寻找符号表地址为例,假设0S1. bin占用从0x0000到0x1000的存储地址,在OSl.bin中,符号表索引地址(SymTbl_Addr)固定,始终为0x100 (实际中也可能为其它的固定值),这时可以将符号表索引地址看作是一个指针,该指针的值为符号表的真实地址,即可以通过符号表索引地址上的值找到符号表真实地址,但符号表索引地址上的值即符号表真实地址并不固定,即符号表(SymTbl)可能位于图x所示的0x0300地址,也可能位于0x0400、0x0200或其它地址。
C.通过符号表特征码 在一些编译规则下,可以利用符号表特征码来找到符号表地址。参见图x,为利用符号表特征码寻找符号表地址的示意图。以OSl.bin为例,符号表由多个表项组成,每个表项都有一定的规则定义的,具有某种特征码。假设每个表项有32个字节,其特征码为第4、5、6、7字节都为O,则通过从低地址往高地址遍历解析二进制程序,如果找到一组连续的符合这些特征码的表项,就找了符号表;所找到的第一个表项的地址就是符号表的首地址。
同时,每个符号表都有一个长度信息,其存放地址也由编译规则确定,如符号表入口地址前的4个字节中存储长度信息等,通过符号表的首地址和长度信息,就可以确定完整的符号表占用空间。 以上为一些利用编译规则的方法,用户也可以通过其它反向工程来找到符号表。
找到符号表后,便可以根据0S1. bin和DRV1. bin符号表中记录的符号信息来找到被引用的符号的在0S1. bin和DRV1. bin中的地址。 与之类似,获取0S1. bin弓|用DRV1. bin的符号信息的在0S1. bin中存储区空间后
可以通过记录的符号信号找到被引用的符号及其引用关系。 S303、对OS和驱动二进制程序进行重新链接; 通过解析二进制程序0S1. bin和DRV1. bin,获取0S1. bin引用DRV1. bin的符号以及这些符号在0S1. bin和DRV1. bin中的地址后开始对OS和驱动二进制程序进行重新链接。 重新链接包括对具有引用关系的函数和/或变量进行重定向,OS和驱动二进制程序中符号的引用关系在编译时可以得到,可以将有关符号的引用信息存储在Flash存储介质(如BIOS)或其它存储介质当中。由于OS是跟虚拟驱动分别编译后再进行静态链接生成二进制程序0S1. bin ;驱动是跟虚拟OS分别编译后再进行静态链接生成二进制程序DRV1.bin;因此,OS和驱动都会引用一些相关符号,包括虚拟函数(如空函数)和/或变量,必须对这些虚拟函数和/或变量进行重定向,才能使之正常工作。 函数和变量由于自己特点不同,重定向的方法也不同,下面分别介绍如何对函数和变量进行重定向
A.函数重定向 以在0S1. bin中重定向函数为例,其具体方法如下先根据0S1. bin中引用DRV1.bin的函数名称,查找0S1. bin和DRV1. bin的符号表,找到这些函数在0S1. bin和DRV1.bin的具体地址;然后修改OSl. bin中该虚拟函数地址的第一条指令为跳转指令,该指令跳转到DRVl.bin中的真实函数入口地址。 现举例说明如下,参见图x,假设0S1. bin中有函数0S_funl和0S_fun2调用了驱动中的函数DRV—fun,为了描述方便,称函数名为DRV—fun的函数在0S1. bin中的虚拟函数为DRV_fun_virtual ;称函数名为DRV_fun的函数在DRV1. bin中的真实函数为DRV_fun_true (在实际符号表中,DRV_fun_virtual在0S1. bin以及DRV_fun_true在DRV1. bin中的函数名都是DRV—fun);假设函数DRV—fun—virtual入口地址为0x1000 ;函数DRV_fun_true的入口地址为0x2000,(两个举例的地址仅表示不同的地址,而并不代表在同一存储介质中)。 在重定向之前,0S_funl和0S_fun2调用DRV_fun_virtual时从0x1000入口地址执行,但因为是虚拟函数,其函数实体为空,因此并不能真正驱动硬件;重定向后将DRV—fun_virtual的第一条指令修改为跳转到DRV_fun_true的指令,这样,每当0S_funl和0S_f皿2调用DRV_fun_Virtual时,执行到第一条指令处时便跳转到真实的驱动函数DRV_fun_true中,DRV_fun_true的函数入口地址为新的地址0x2000。
与此类似,DRV1. bin中的函数重定向过程可参考上述方法进行,即先根据DRV1.bin中引用OSl. bin的函数名称,查找DRVl. bin和OSl. bin的符号表,找到这些函数在OSl.bin和DRV1. bin的具体地址;然后修改DRV1. bin中该虚拟函数地址的第一条指令为跳转指令,该指令跳转到OSl.bin中的真实函数入口地址。
B.变量重定向 变量重定向与函数重定向有所不同,函数重写向是修改虚拟函数中的入口指令为跳转指令,使其跳转到真实函数当中去;而变量重定向则需要为引用这些变量的指令中引用的变量分配一个地址空间,可以是在虚拟子系统中,也可以是在真实系统中,其具体方法如下所示 以在OSl. bin中重定向变量为例,其具体方法如下先根据OSl. bin中引用DRV1.bin的变量名称,查找DRVl.bin中这个变量的真实地址;然后在OSl. bin中找到引用这个变量的指令(在编译OSl.bin时通过工具解析obj目标文件生成,记录在OSl.bin中的某个存储区域,查找该存储区域的方法可参考S302步骤),修改这些指令中引用的变量地址为在DRV1. bin中的变量的真实地址。 与此类似,在DRVl.bin中重定向过程可参考在OSl. bin中重定向变量的过程,即先根据DRV1. bin中引用OSl. bin的变量名称,查找OSl. bin中这个变量的真实地址;然后在DRVl.bin中找到引用这个变量的指令(在编译DRVl.bin时通过编译工具生成,记录在DRV1. bin中的某个区域,查找该区域的方法可参考查找符号表的方法),修改这些指令中引用的变量地址为在DRV1. bin中的变量的真实地址。 由于变量重定向时只需为其分配一个存储空间,因此,可以不将OSl.bin中和DRV1. bin中的变量重定向到变量真实存储地址,而可以将变量都重定向到OSl. bin中的变量存储地址,或都重定向到DRV1. bin中的变量存储地址。 以将变量都重定向到OSl. bin中的变量存储地址为例,其具体方法为在OSl. bin中保持引用这些变量的指令保持不变;在DRVl.bin中的需要重定向的变量重定向到OSl.bin中,此步骤具体方法可参考上文。 与此类似,将变量都重定向到DRV1. bin中的变量存储地址具体方法为在DRV1.bin中保持引用这些变量的指令保持不变;在OSl. bin中的需要重定向的变量重定向到DRV1. bin中,此步骤具体方法可参考上文。 上述方法为本发明实施例一种程序链接技术中对二进制程序进行重新链接的具体实现过程。通过本发明实施例,使得在由多个软件子系统组成的软件系统,当其中一个或多个软件子系统升级时,其它软件子系统可以无需重新编译和升级。 参见图8,本发明实施例还提供了一种程序链接装置10,包括解析单元101,用于
通过解析第一程序和第二程序,获取所述第一程序引用所述第二程序中的第一符号,以及获取所述第一符号在所述第一程序中的第一地址和所述第一符号在第二程序中的第二地址; 重定向单元102,用于根据所述第一地址和所述第二地址,对所述第一符号进行重定向。
解析单元101包括 获取单元1011,用于用于通过解析第一程序和第二程序,获取所述第一程序引用
10所述第二程序中的第一符号,以及获取所述第一程序的符号表和所述第二程序的符号表;
查找单元1012,用于通过查找所述第一程序的符号表和所述第二程序的符号表,获取所述第一符号在第一程序中的第一地址和在所述第二程序中的第二地址。
下面以嵌入式单板装置为例,本对本发明程序链接装置进行说明
先将OS源代码和虚拟驱动源代码编译并静态链接后生成的二进制程序0S1. bin存储在一个存储介质当中(该存储区可以是本地硬盘,或者远程服务器中,或者其它存储介质);将驱动程序的源代码和虚拟OS源代码编译并静态链接后生成的DRV1. bin存储于硬件内置的存储介质当中, 一般都存储在Flash当中,如BIOS(这里的BIOS可以理解为存放着一段操作系统正常启动时引导代码的区域),但也不限于其它硬件内置的已知或未知存储介质,如RAM、 SDRAM等存储介质当中;实现重新链接技术的实现程序也存储在硬件内置存储介质当中(利用Flash介质做成的BIOS)。 单板系统上电后,CPU开始从BIOS中读取程序代码,执行过程中,先将DRV1. bin从Flash (如BIOS)复制到内存,然后从存储0S1. bin的存储介质中将0S1. bin加载到内存,开始对二进制程序DRV1. bin和0S1. bin进行重新链接,最终生成DRV. bin和OS. bin可在具体硬件上运行的二进制程序,接着通过最新生成的二进制程序执行OS和其它程序的启动。
更具体地,所述单板系统为一台PC机主板,将驱动程序的源代码和虚拟OS源代码、重新链接程序源代码编译并静态链接后生成的DRVl.bin存储于主板的BIOS芯片中。将Windows或Linux操作系统在虚拟机器上的安装版本(也就是将Windows或Linux与虚拟驱动源代码一起安装编译链接生成的二进制程序0S1. bin及其他OS动态链接库)存储在硬盘中。PC机上电或复位后,CPU开始从BIOS中读取程序代码,执行过程中,先将DRV1. bin从BIOS复制到内存,然后从硬盘中将OSl.bin加载到内存,开始对二进制程序DRVl.bin和0S1. bin进行重新链接,最终生成可在本主板上运行的二进制程序DRV. bin和OS. bin,接着通过最新生成的二进制程序启动Windows或Li皿x操作系统,然后在动态加载其他操作系统组件和应用组件。 本发明实施例中,通过将OS源代码和驱动源代码分别与虚拟驱动和驱动OS编译静态链接后生成二进制程序(如0S1. bin、 DRV1. bin),通过对二进制程序中的符号进行重新链接生成可运行的二进制程序OS. bin和DRV. bin。 由于OSl.bin中没有与具体硬件相关的程序,因此更换硬件时,无需重新编译OSl.bin,只需要更换DRVl.bin即可。由于DRV. bin是存储在具体硬件的存储介质上(如Flash做的BIOS中),因此,更换硬件的同时,可以更换配置的DRV. bin。比如更换PC主板时,只需要在主板上存储配套硬件的驱动,就可以无需重装操作系统而直接使用,使得在由多个软件子系统组成的软件系统,当其中一个或多个软件子系统升级时,其它软件子系统可以无需重新编译和升级。 以上举较佳实施例,对本发明的目的、技术方案和优点进行了进一步详细说明,所应理解的是,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
一种程序链接方法,其特征在于,包括如下步骤通过解析第一程序和第二程序,获取所述第一程序引用所述第二程序中的第一符号,以及获取所述第一符号在所述第一程序中的第一地址和所述第一符号在第二程序中的第二地址;所述第一符号包括函数和/或变量;根据所述第一地址和所述第二地址,对所述第一符号进行重定向。
2. 如权利要求1所述的程序链接方法,其特征在于,所述第一程序由第一源代码和第 二虚拟源代码编译并静态链接生成,所述第二虚拟源代码为所述第一源代码提供需要引用 的函数和/或变量。
3. 如权利要求1所述的程序链接方法,其特征在于,所述通过解析第一程序和第二程 序,获取所述第一符号在所述第一程序中的第一地址和所述第一符号在第二程序中的第二 地址的步骤包括获取所述第一程序的符号表和所述第二程序的符号表,通过查找所述第一程序的符号 表和所述第二程序的符号表,获取所述第一符号在第一程序中的第一地址和在所述第二程 序中的第二地址。
4. 如权利要求3所述的程序链接方法,其特征在于,所述获取所述第一程序的符号表 和所述第二程序的符号表的方法包括获取所述第一程序的符号表索引地址和所述第二程序的符号表索引地址; 通过所述第一程序的符号表索引地址和所述第二程序的符号表索引地址,获取所述第 一程序的符号表和所述第二程序的符号表;所述符号表索引地址位于所述第一程序和所述第二程序中的固定地址。
5. 如权利要求3所述的程序链接方法,其特征在于,所述获取所述第一程序的符号表 和所述第二程序的符号表的方法包括通过符号表地址获取所述第一程序的符号表和所述第二程序的符号表; 所述符号表地址位于所述第一程序和所述第二程序中的固定地址。
6. 如权利要求3所述的程序链接方法,其特征在于,所述获取符号表的步骤包括 根据符号表特征码,搜索所述第一程序和所述第二程序中符合所述符号表特征码的表项,根据符合所述符号表特征码的表项获取所述第一程序的符号表和所述第二程序的符号 表。
7. 如权利要求1所述的程序链接方法,其特征在于,所述根据所述第一地址和所述第 二地址,对所述第一符号进行重定向的步骤包括当所述第一符号为函数时,查找所述第一程序的符号表和所述第二程序的符号表, 找到所述第一程序引用所述第二程序的函数在所述第一程序和所述第二程序中的具体地 址;修改所述第一程序中所述函数的第一条指令为跳转到所述第二程序中的函数的跳转指 令;当所述第一符号为变量时,修改所述第一程序引用所述第二程序中变量的指令中的所 述变量地址为所述变量在所述第二程序中的地址;或者保持所述第一程序引用所述第二程 序中变量的指令中的所述变量地址不变。
8. 如权利要求1所述的程序链接方法,其特征在于,所述程序链接方法进一步包括如 下步骤通过解析第一程序和第二程序,获取所述第二程序引用所述第一程序中的第二符号, 以及获取所述第二符号在所述第一程序中的第三地址和所述第二符号在第二程序中的第 四地址;所述第二符号包括函数和/或变量;根据所述第三地址和所述第四地址,对所述第二符号进行重定向。
9. 如权利要求8所述的程序链接方法,其特征在于所述第二程序由第三源代码和第四源代码编译并静态链接生成,所述第三源代码为所 述第四源代码提供需要引用的函数和/或变量。
10. 如权利要求8所述的程序链接方法,其特征在于,所述通过解析第一程序和第二程 序,获取所述第二符号在所述第一程序中的第三地址和所述第二符号在第二程序中的第四 地址的步骤包括获取所述第一程序的符号表和所述第二程序的符号表,通过查找所述第一程序的符号 表和所述第二程序的符号表,获取所述第二符号在第一程序中的第三地址和在所述第二程 序中的第四地址,所述第二符号包括函数和/或变量。
11. 如权利要求8所述的程序链接方法,其特征在于,所述根据所述第三地址和所述第 四地址,对所述第二符号进行重定向的步骤包括当所述第二符号为函数时,查找所述第一程序的符号表和所述第二程序的符号表, 找到所述第二程序引用所述第一程序的函数在所述第一程序和所述第二程序中的具体地 址;修改所述第二程序中所述函数的第一条指令为跳转到所述第一程序中的函数的跳转指 令;当所述第二符号为变量时,修改所述第二程序引用所述第一程序中变量的指令中的所 述变量地址为所述变量在所述第一程序中的地址;或者保持所述第二程序引用所述第一程 序中变量的指令中的所述变量地址不变。
12. —种程序链接装置,其特征在于,包括解析单元,用于通过解析第一程序和第二程序,获取所述第一程序引用所述第二程序中的第一符号,以及获取所述第一符号在所述第一程序中的第一地址和所述第一符号在第 二程序中的第二地址;重定向单元,用于根据所述第一地址和所述第二地址,对所述第一符号进行重定向。
13. 如权利要求12所述的程序链接装置,其特征在于,所述解析单元包括 获取单元,用于通过解析第一程序和第二程序,获取所述第一程序引用所述第二程序中的第一符号,以及获取所述第一程序的符号表和所述第二程序的符号表;查找单元,用于通过查找所述第一程序的符号表和所述第二程序的符号表,获取所述 第一符号在第一程序中的第一地址和在所述第二程序中的第二地址,所述符号包括函数和 /或变量。
14. 如权利要求13所述的程序链接装置,其特征在于,所述获取单元包括 符号表索引地址获取单元,用于通过解析第一程序和第二程序,获取所述第一程序引用所述第二程序中的第一符号,以及通过获取所述第一程序的符号表索引地址和所述第二 程序的符号表索引地址获取所述第一程序的符号表和所述第二程序的符号表。
15. 如权利要求13所述的程序链接装置,其特征在于,所述获取单元包括 符号表地址获取单元,所述符号表地址获取单元用于通过解析第一程序和第二程序,获取所述第一程序引用所述第二程序中的第一符号,以及通过获取所述第一程序的符号表 地址和所述第二程序的符号表地址获取所述第一程序的符号表和所述第二程序的符号表。
16. 如权利要求13所述的程序链接装置,其特征在于,所述获取单元包括 符号表特征码获取单元,用于通过解析第一程序和第二程序,获取所述第一程序引用所述第二程序中的第一符号,以及通过根据符号表特征码,搜索所述第一程序和所述第二 程序中符合所述符号表特征码的表项,根据符合所述符号表特征码的表项获取所述第一程 序的符号表和所述第二程序的符号表。
17. 如权利要求13所述的程序链接装置,其特征在于,所述重定向单元包括 函数重定向单元,用于当所述第一符号为函数时,修改所述第一程序中所述第一地址的第一条指令为跳转到所述第二地址的跳转指令;变量重定向单元,用于当所述第一符号为变量时,修改所述第一程序引用所述第二程 序中变量的指令中的所述变量地址为所述变量在所述第二程序中的地址;或者保持所述第 一程序引用所述第二程序中变量的指令中的所述变量地址不变。
18. 如权利要求17所述的程序链接装置,其特征在于,所述解析单元还用于,通过解析 第一程序和第二程序,获取所述第二程序引用所述第一程序中的第二符号,以及获取所述 第二符号在所述第一程序中的第三地址和所述第一符号在第二程序中的第四地址,所述第 二符号包括函数和/或变量;所述重定向单元还用于,根据所述第一地址和所述第二地址,对所述第二符号进行重 定向;所述函数重定向单元,还用于当所述第二符号为函数时,修改所述第二程序中所述第 三地址的第一条指令为跳转到所述第四地址的跳转指令;所述变量重定向单元,还用于当所述第一符号为变量时,修改所述第二程序引用所述 第一程序中变量的指令中的所述变量地址为所述变量在所述第一程序中的地址;或者保持 所述第二程序引用所述第一程序中变量的指令中的所述变量地址不变。
全文摘要
本发明实施例公开了一种程序链接方法及装置,其中,所述方法包括如下步骤通过解析第一程序和第二程序,获取所述第一程序引用所述第二程序中的第一符号,以及获取所述第一符号在所述第一程序中的第一地址和所述第一符号在第二程序中的第二地址;根据所述第一地址和所述第二地址,对所述第一符号进行重定向。通过本发明实施例程序链接方法,可以使在由多个软件子系统组成的软件系统,当其中一个或多个软件子系统升级时,其它软件子系统可以无需重新编译和升级。
文档编号G06F9/45GK101782860SQ200910105198
公开日2010年7月21日 申请日期2009年1月21日 优先权日2009年1月21日
发明者杜开田, 王伟 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1