[发明专利]动态替换主程序中C/C++函数的方法及装置有效
申请号: | 201210047538.9 | 申请日: | 2012-02-27 |
公开(公告)号: | CN103294457B | 公开(公告)日: | 2017-02-01 |
发明(设计)人: | 禤彪 | 申请(专利权)人: | 百度在线网络技术(北京)有限公司 |
主分类号: | G06F9/44 | 分类号: | G06F9/44;G06F9/45 |
代理公司: | 北京清亦华知识产权代理事务所(普通合伙)11201 | 代理人: | 宋合成 |
地址: | 100085 北京市*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 动态 替换 主程序 c++ 函数 方法 装置 | ||
技术领域
本发明涉及计算机科学技术领域,特别涉及一种动态替换主程序中C/C++函数的方法及装置。
背景技术
在Linux下进行C/C++程序的调试、Mock和测试等工作时,经常需要用到函数替换。函数替换是指使用替换函数覆盖被替换函数。现有Linux下替换C/C++函数的技术主要是通过设置LD_PRELOAD环境变量,在程序启动时一次性加载共享库来完成函数替换的。在加载过程中,如果共享库中有同名函数,如malloc等,则会自动将对应的系统函数malloc替换为共享库中的替换函数malloc。
现有方法虽然可以实现函数替换,但是存在以下缺点:
(1)Linux下设置LD_PRELOAD环境变量的方法为一次性在程序启动时进行加载,因此不能在程序运行时动态地替换和还原共享库函数。每次进行函数替换,都需要重新加载共享库,启动程序,因此操作时间长,替换效率低。
(2)由于被替换的系统函数将被完全替代,因此如果在替换函数的内部间接地调用被替换的系统函数,则将会导致替换函数重复调用自身,从而造成死循环。
(3)设置LD_PRELOAD环境变量的方法只能加载共享库函数,因此现有方法不能替换非共享库的函数,如用户自定义的函数等,因此为用户的使用造成不便。
发明内容
本发明的目的旨在至少解决上述技术缺陷之一。
为此,本发明的目的在于提出一种动态替换主程序中C/C++函数的方法,在C/C++函数替换时,能够实现程序运行时动态地替换和还原函数,无需再对程序进行编译,省时高效,并且避免在替换函数内部间接调用被替换函数出现的死循环现象。该方法可以应用于C/C++程序的调试、Mock和测试等。在本发明的一个优选实施例中,本发明应用于Linux下。
为达到上述目的,本发明的实施例公开了一种动态替换主程序中C/C++函数的方法。该方法包括以下步骤:启动主程序,并加载用于查询和修改内存的替换程序模块;对加载的所述替换程序模块进行初始化以使所述替换程序模块先于所述主程序中的主函数执行,并将所述主程序中函数的符号表信息保存到内存中;在所述替换程序模块接收到替换指令之后,所述替换程序模块根据被替换函数对应的符号表信息确定所述被替换函数在所述内存中的映像地址;以及根据所述映像地址对所述被替换函数进行替换。
本发明实施例在启动主程序的同时加载用于查询和修改内存的替换程序模块。当进行函数替换时,通过替换程序模块在程序运行时动态修改程序的内存映像来完成函数替换过程,因此无需修改程序的二进制文件,且无需对源代码进行再编译,在程序运行时可以动态地替换和还原,提高了程序的效率。
并且,由于在改变被替换函数对应的内存映像地址时保存了被替换函数的地址,因此避免了在通过环境变量方法一次性在程序启动时加载替换函数时,出现的替换函数内部间接调用被替换函数的死循环现象。
此外,本发明实施例通过替换程序模块修改内存映像来完成函数替换,因此替换的函数不限制于共享库函数,替换范围能够扩展到非共享库函数,用户可以自定义替换函数。
在本发明的一个实施例中,所述被替换函数为动态函数,所述根据所述映像地址对所述被替换函数进行替换进一步包括:将所述被替换函数的映像地址进行备份;以及将所述被替换函数的映像地址替换为新函数的映像地址。
本发明实施例通过在更新函数的映像地址前进行备份,使得函数替换过程可以回溯,从而实现替换函数的动态还原。
在本发明的一个实施例中,所述被替换函数为静态函数,所述根据所述映像地址对所述被替换函数进行替换进一步包括:根据所述被替换函数的映像地址确定所述被替换函数的入口地址;根据所述被替换函数的入口地址将所述被替换函数对应的字节码分为第一段字节码和第二段字节码,其中,以指令为基本单元进行划分,所述第一段字节码为从函数入口至长度长于远跳指令的最小长度字节码;将所述第一段字节码备份至新分配内存,并将所述新分配内存中所述第一段字节码中的相对地址跳转修改为绝对地址跳转;在所述新分配内存中所述第一段字节码之后添加第一远跳指令,所述第一远跳指令跳转到所述第二段字节码;以及将所述被替换函数对应的第一段字节码修改为第二远跳指令,所述第二远跳指令跳转到新函数的映像地址。
本发明实施例通过新分配内存并修改被替换函数,使得函数替换过程可以回溯,从而实现被替换函数的动态还原。
在本发明的一个实施例中,所述替换程序模块作为共享库,由Linux的LD_PRELOAD环境变量进行加载。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于百度在线网络技术(北京)有限公司,未经百度在线网络技术(北京)有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201210047538.9/2.html,转载请声明来源钻瓜专利网。