程序的功能变更方法及装置的制造方法

文档序号:9865216阅读:157来源:国知局
程序的功能变更方法及装置的制造方法
【技术领域】
[0001]本发明属于计算机技术领域,尤其涉及程序的功能变更方法及装置。
【背景技术】
[0002]通过C/C++等编程语言编写的程序,在经过预处理、编译、汇编、链接等编译过程之后生成可执行文件,而程序的运行即是对可执行文件的运行。然而在现阶段,一旦程序编译完成,其程序功能是不能发生改变的,若要变更程序功能,只能对程序的源代码进行修改,并重复上述预处理、编译、汇编、链接的编译过程,生成新的可执行文件以重新运行,实现过程复杂。

【发明内容】

[0003]有鉴于此,本发明实施例提供了程序的功能变更方法及装置,旨在解决现有技术在程序编译完成之后无法改变其程序功能的问题。
[0004]第一方面,提供了一种程序的功能变更方法,包括:
[0005]接收函数替换请求和替换函数,所述函数替换请求用于将程序的源代码中的目标函数变更为所述替换函数;
[0006]将所述替换函数编译为临时动态库后获取所述替换函数对应的函数地址,将所述替换函数对应的函数地址与所述目标函数关联后写入预设的全局符号表;
[0007]在所述程序的运行过程中,执行所述目标函数之前,通过所述预设的全局符号表获取所述替换函数对应的函数地址;
[0008]将所述目标函数的入口变更为所述替换函数对应的函数地址,执行所述替换函数,返回函数值。
[0009]第二方面,提供了一种程序的功能变更装置,包括:
[0010]接收单元,用于接收函数替换请求和替换函数,所述函数替换请求用于将程序的源代码中的目标函数变更为所述替换函数;
[0011]写入单元,用于将所述替换函数编译为临时动态库后获取所述替换函数对应的函数地址,将所述替换函数对应的函数地址与所述目标函数关联后写入预设的全局符号表;
[0012]获取单元,用于在所述程序的运行过程中,执行所述目标函数之前,通过所述预设的全局符号表获取所述替换函数对应的函数地址;
[0013]变更单元,用于将所述目标函数的入口变更为所述替换函数对应的函数地址,执行所述替换函数,返回函数值。
[0014]本发明实施例可以实现在程序编译完成之后,尤其是在程序的运行过程之中,对程序功能的变更,使得对程序的功能变更无需再经历复杂的程序编译过程,变更过程具备实时性和动态性。
【附图说明】
[0015]为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0016]图1是本发明实施例提供的程序的功能变更方法的实现流程图;
[0017]图2是本发明实施例提供的程序的功能变更方法SlOl的具体实现流程图;
[0018]图3是本发明另一实施例提供的程序的功能变更方法的实现流程图;
[0019]图4是本发明实施例提供的功能变更装置的结构框图。
【具体实施方式】
[0020]以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透切理解本发明实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本发明。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本发明的描述。
[0021]图1示出了本发明实施例提供的程序的功能变更方法的实现流程,详述如下:
[0022]在SlOl中,接收函数替换请求和替换函数,所述函数替换请求用于将程序的源代码中的目标函数变更为所述替换函数。
[0023]在本发明实施例中,函数替换请求和替换函数一起发送,函数替换请求指向了程序的源代码中的某一目标函数,用于指示在该程序的运行过程中,需要执行该目标函数时,将对目标函数的执行变更为对替换函数的执行,从而达到对程序进行功能变更的目的。其中,发送函数替换请求和替换函数的一方可以为运行该程序的终端的本机进程,也可以为相对于运行该程序的终端来说的远程进程。
[0024]作为本发明的一个实施例,接收函数替换请求和替换函数的动作可以发生在程序的运行过程中,如图2所示,SlOl具体通过以下方式实现:
[0025]在S201中,在所述程序启动运行之后,创建用于接收函数替换请求和替换函数的线程。
[0026]在S202中,通过所述线程,在所述程序的运行过程中接收函数替换请求和替换函数。
[0027]在该程序启动运行之后,程序首先自动地创建一个线程,该线程专门用于在程序的运行过程中接收来自控制一方(即上述本机进程或者远程进程)的函数替换请求和替换函数,这样一来,用户若想使程序实现某个功能的变更,可以在程序的运行过程中实时地发起函数替换请求,更好地实现了程序运行过程中对功能的动态变更。
[0028]在S102中,将所述替换函数编译为临时动态库后获取所述替换函数对应的函数地址,将所述替换函数对应的函数地址与所述目标函数关联后写入预设的全局符号表。
[0029]在接收到函数替换请求之后,首先保存与该函数替换请求对应的替换函数,并对该替换函数执行编译过程,调用编译器,将该替换函数编译为一个临时动态库,之后,通过系统调用,打开该临时动态库,通过该临时动态库获取到该替换函数对应的函数地址,并对预设的全局符号表进行刷新,刷新过程会将函数替换请求中指示的目标函数与获取到的函数地址相关联,写入预设的全局符号表。
[0030]在S103中,在所述程序的运行过程中,执行所述目标函数之前,通过所述预设的全局符号表获取所述替换函数对应的函数地址。
[0031]程序的运行过程,即是执行程序的源代码,并在执行过程中一一调用并执行源代码中的每个函数的过程。而在本发明实施例中,为了实现将目标函数变更为替换函数执行,从而实现程序功能变更的目的,可以在程序编译前的预处理过程中,就在该程序源代码内的每个函数入口均分别插入一个预处理宏,这样一来,在执行每个函数之前,均会先执行该预处理宏,该预处理宏是用于在执行函数前对预设的全局符号表进行查找,根据查找结果,若当前函数在预设的全局符号表中关联了函数地址,则表明要将当前函数变更为替换函数以执行;若当前函数在预设的全局符号表中未关联函数地址,则仍旧执行当前函数。
[0032]因此,在该程序的运行过程中,执行函数替换请求所指示的目标函数之前,先会执行上述预处理宏,随着该预处理宏的执行,会在预设的全局符号表中查找出该目标函数关联了函数地址,该函数地址即为该目标函数对应的替换函数的函数地址,从而获取到该目标函数对应的替换函数的函数地址。
[0033]在S104中,将所述目标函数的入口变更为所述替换函数对应的函数地址,执行所述替换函数,返回函数值。
[0034]在获取到目标函数对应的替换函数的函数地址之后,会将该目标函数的入口变更为其对应的替换函数的函数地址,由此,在执行到目标函数时,并不会执行该目标函数的代码,而是转而调用并执行该目标函数对应的替换函数,得到该替换函数的函数值,再将该函数值作为结果返回,代替原本该目标函数的执行结果,由此,在程序运行过程中实现对程序功能的变更。
[0035]作为本发明的一个实施例,如图3所示,在SlOl之前,所述方法还包括:
[0036]在S105中,创建用于接收函数替换请求和替换函数,以及用于保存所述预设的全局符号表的核心库。
[0037]在S106中,在所述程序的编译过程中,链接所述核心库。
[0038]在本实施例中,可以将接收函数替换请求、接收替换函数及保存替换函数,以及保存并维护预设的全局符号表的功能封装为一个核心库,并在程序的编译过程中,对该核心库进行链接,由此通过链接的方式,方便地对上述功能完成编译。
[0039]进一步地,上述SlOl和S102的功能也可以由程序的后台服务器完成,从而减轻运行程序的终端的处理压力,提高方案的实施效率。
[0040]本发明实施例可以实现在程序编译完成之后,尤其是在程序的运行过程之中,对程序功能的变更,使得对程序的功能变更无需再经历复杂的程序编译过程,变更过程具备实时性和动态性,可被广泛地运用于程序调试或者动态功能模块替换等应用领域之中。
[0041]应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
[0042]对应于上文实施例所述的程序的功能变更方法,图4示出了本发明实施例提供的程序的功能变更装置的结构框图。为了便于说明,仅示出了与本实施例相关的部分。
[0043]参照图4,该装置包括:
[0044]接收单元41,接收函数替换请求和替换函数,所述函数替换请求用于将程序的源代码中的目标函数变更为所述替换函数;
[0045]写入单元42,将所述替换函数编译为临时动态库后获取所述替换函数对应的函数地址,将所述替换函数对应的函数地址与所述目标函数关联后写入预设的全局符号表;
[0046]获取单元43,在所述程序的运行过程中,执行所述目标函数之前,通过所述预设的全局符号表获取所述替换函数对应的函数地址;
[0047]变更单元44,将所述目标函数的入口变更为所述替换函数对应的函数地址,执
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1