【技术实现步骤摘要】
动态替换主程序中C/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++函数的方法,其特征在于,包括以下步骤:启动主程序,并加载用于查询和修改内存的替换程序模块;对加载的所述替换程序模块进行初始化以使所述替换程序模块先于所述主程序中的主函数执行,并将所述主程序中函数的符号表信息保存到内存中;在所述替换程序模块接收到替换指令之后,所述替换程序模块根据被替换函数对应的符号表信息确定所述被替换函数在所述内存中的映像地址;以及根据所述映像地址对所述被替换函数进行替换。
【技术特征摘要】
1.一种动态替换主程序中C/C++函数的方法,其特征在于,包括以下步骤:启动主程序,并加载用于查询和修改内存的替换程序模块;对加载的所述替换程序模块进行初始化以使所述替换程序模块先于所述主程序中的主函数执行,并将所述主程序中函数的符号表信息保存到内存中;在所述替换程序模块接收到替换指令之后,所述替换程序模块根据被替换函数对应的符号表信息确定所述被替换函数在所述内存中的映像地址;以及确定所述被替换函数的类型,根据所述映像地址对所述被替换函数进行替换。2.如权利要求1所述的动态替换主程序中C/C++函数的方法,其特征在于,所述确定所述被替换函数的类型,根据所述映像地址对所述被替换函数进行替换,包括:当所述被替换函数的类型为动态函数类型时,将所述被替换函数的映像地址进行备份;以及将所述被替换函数的映像地址替换为新函数的映像地址。3.如权利要求1所述的动态替换主程序中C/C++函数的方法,其特征在于,所述确定所述被替换函数的类型,根据所述映像地址对所述被替换函数进行替换,包括:当所述被替换函数的类型为静态函数类型,根据所述被替换函数的映像地址确定所述被替换函数的入口地址;根据所述被替换函数的入口地址将所述被替换函数对应的字节码分为第一段字节码和第二段字节码,其中,以指令为基本单元进行划分,所述第一段字节码为从函数入口至长度长于远跳指令的最小长度字节码;将所述第一段字节码备份至新分配内存,并将所述新分配内存中所述第一段字节码中的相对地址跳转修改为绝对地址跳转;在所述新分配内存中所述第一段字节码之后添加第一远跳指令,所述第一远跳指令用于跳转到所述第二段字节码;以及将所述被替换函数对应的第一段字节码修改为第二远跳指令,所述第二远跳指令用于跳转到新函数的映像地址。4.如权利要求1所述的动态替换主程序中C/C++函数的方法,其特征在于,所述替换程序模块作为共享库,由Linux的LD_PRELOAD环境变量进行加载。5.如权利要求4所述的动态替换主程序中C/C++函数的方法,其特征在于,所述由Linux的所述LD_PRELOAD环境变量进行加载进一步包括:设置所述LD_PRELOAD环境变量为编译成所述共享库的所述替换程序模块和用户编写的独立桩模块,其中,所述用户编写的独立桩模块的初始化函数可对函数的动态替换进行设置;以及启动所述主程序。6.如权利要求1所述的动态替换主程序中C/C++函数的方法,其特征在于,所述替换程序模块作为静态库,通过编译时的链接进行加载。7.如权利要求6所述的动态替换主程序中C/C++函数的方法,其特征在于,所述替换程序模块作为所述静态库,通过编译时链接进行加载进一...
【专利技术属性】
技术研发人员:禤彪,
申请(专利权)人:百度在线网络技术北京有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。