[发明专利]动态替换主程序中C/C++函数的方法及装置有效
申请号: | 201210047538.9 | 申请日: | 2012-02-27 |
公开(公告)号: | CN103294457B | 公开(公告)日: | 2017-02-01 |
发明(设计)人: | 禤彪 | 申请(专利权)人: | 百度在线网络技术(北京)有限公司 |
主分类号: | G06F9/44 | 分类号: | G06F9/44;G06F9/45 |
代理公司: | 北京清亦华知识产权代理事务所(普通合伙)11201 | 代理人: | 宋合成 |
地址: | 100085 北京市*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 动态 替换 主程序 c++ 函数 方法 装置 | ||
1.一种动态替换主程序中C/C++函数的方法,其特征在于,包括以下步骤:
启动主程序,并加载用于查询和修改内存的替换程序模块;
对加载的所述替换程序模块进行初始化以使所述替换程序模块先于所述主程序中的主函数执行,并将所述主程序中函数的符号表信息保存到内存中;
在所述替换程序模块接收到替换指令之后,所述替换程序模块根据被替换函数对应的符号表信息确定所述被替换函数在所述内存中的映像地址;以及
根据所述映像地址对所述被替换函数进行替换。
2.如权利要求1所述的动态替换主程序中C/C++函数的方法,其特征在于,所述被替换函数为动态函数。
3.如权利要求2所述的动态替换主程序中C/C++函数的方法,其特征在于,所述根据所述映像地址对所述被替换函数进行替换进一步包括:
将所述被替换函数的映像地址进行备份;以及
将所述被替换函数的映像地址替换为新函数的映像地址。
4.如权利要求1所述的动态替换主程序中C/C++函数的方法,其特征在于,所述被替换函数为静态函数。
5.如权利要求4所述的动态替换主程序中C/C++函数的方法,其特征在于,所述根据所述映像地址对所述被替换函数进行替换进一步包括:
根据所述被替换函数的映像地址确定所述被替换函数的入口地址;
根据所述被替换函数的入口地址将所述被替换函数对应的字节码分为第一段字节码和第二段字节码,其中,以指令为基本单元进行划分,所述第一段字节码为从函数入口至长度长于远跳指令的最小长度字节码;
将所述第一段字节码备份至新分配内存,并将所述新分配内存中所述第一段字节码中的相对地址跳转修改为绝对地址跳转;
在所述新分配内存中所述第一段字节码之后添加第一远跳指令,所述第一远跳指令用于跳转到所述第二段字节码;以及
将所述被替换函数对应的第一段字节码修改为第二远跳指令,所述第二远跳指令用于跳转到新函数的映像地址。
6.如权利要求1所述的动态替换主程序中C/C++函数的方法,其特征在于,所述替换程序模块作为共享库,由Linux的LD_PRELOAD环境变量进行加载。
7.如权利要求6所述的动态替换主程序中C/C++函数的方法,其特征在于,所述由Linux的所述LD_PRELOAD环境变量进行加载进一步包括:
设置所述LD_PRELOAD环境变量为编译成所述共享库的所述替换程序模块和用户编写的独立桩模块,其中,所述用户编写的独立桩模块的初始化函数可对函数的动态替换进行设置;以及
启动所述主程序。
8.如权利要求1所述的动态替换主程序中C/C++函数的方法,其特征在于,所述替换程序模块作为静态库,通过编译时的链接进行加载。
9.如权利要求8所述的动态替换主程序中C/C++函数的方法,其特征在于,所述替换程序模块作为所述静态库,通过编译时链接进行加载进一步包括:
在所述主程序中通过应用程序编程接口API对函数的动态替换进行设置;
在所述主程序中添加指向所述替换程序模块的链接并对所述主程序进行编译,其中,所述替换程序模块已经通过编译并作为静态库;以及
启动所述主程序。
10.如权利要求1所述的动态替换主程序中C/C++函数的方法,其特征在于,通过C/C++关键字__attribute__((constructor))定义属性函数,其中,所述属性函数对所述替换程序模块进行初始化。
11.一种动态替换主程序中C/C++函数的装置,其特征在于,包括:
替换程序模块,用于查询和修改内存,并在接收到替换指令之后,根据被替换函数对应的符号表信息确定所述被替换函数在所述内存中的映像地址,以及根据所述映像地址对所述被替换函数进行替换;以及
加载及初始化模块,用于加载并初始化所述替换程序模块以使所述替换程序模块先于所述主程序中的主函数执行,并将所述主程序中函数的符号表信息保存到内存中。
12.如权利要求11所述的动态替换主程序中C/C++函数的装置,其特征在于,所述被替换函数为动态函数。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于百度在线网络技术(北京)有限公司,未经百度在线网络技术(北京)有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201210047538.9/1.html,转载请声明来源钻瓜专利网。