赞
踩
上半年做运营商的一个项目,设备规范是中兴华为这些大厂商写的,其中有关于热补丁的要求。运营商对设备运行时间要求很高,不会让更改一个小小的问题都要重启程序。所以就有了热补丁要求:要求程序在运行过程中能够更改程序的行为。
关于linux下热补丁的实现资料不多,我只找到一个:http://www.cnblogs.com/WuCountry/archive/2010/02/22/1671537.html
这里面有一个大致的实现可以参考,但是还要解决一些问题。我会写几篇文章,记录一下这次开发过程,也算做个总结。
先说一下要求:
1、要能够在程序运行过程中更改程序的行为。
程序运行过程中是加载到内存中的,要更改程序的行为,就要更改进程的内存。我这里使用的ptrace函数。
2、新的程序行为如何动态加入到进程内存中。
新的程序以动态链接库的形式加载到内存中。有两种加载方法,一是在进程中开辟一段内存,然后将动态链接库加载到这段内存中;而是使用系统函数dlopen将动态链接库加载到程序进程中。
3、如何把函数的行为替换为新的行为。
使用bfd库找到需要替换的函数地址,以及新的函数地址,然后把原有函数起始内存更改为JMP命令加新的函数地址。
4、如果需要更改的函数是static函数,是否可以通过这种方式更改?
5、新的函数如何调用原有进程中的其他函数?如何访问原有的全局变量?如何访问static类型函数以及static全局变量?
后面会详细说明这些内容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。