一、热补丁简介
一个正在运行的程序,要是有某函数或某流程有问题,需要修改,有两个方式:
1.通过设置LD_PRELOAD把需要的库重新定向,但这种方式需要重启正在运行的程序。
2.通过修改可执行文件某个函数指向的地址,指向新的函数,这种方式可不重启正在运行的程序。这就热补丁(hotpatch)。
二、热补丁使用
1.API介绍
Linux提供了一套API来动态装载库。热补丁主要使用如下API:
- dlopen,打开一个库,并为使用该库作些准备。
- dlsym,在打开的库中查找符号的值。
- dlclose,关闭库。
在使用一下API时,要提前包含头文件**#include <dlfcn.h>**
dlopen函数原型:
void *dlopen(const char *filename, int flags);
--filename是你要打开的库路径
--flags必须有RTLD_LAZY或者RTLD_NOW其中之一。
RTLD_LAZY:在dlopen返回前,
对于动态库中的未定义的符号不执行解析。(仅针对函数,变量立即解析)
RTLD_NOW:需要在dlopen返回前,
解析出所有未定义符号,如果解析不出来,在则会返回NULL和错误。
***/*可以和一下参数进行搭配使用*/***
--RTLD_GLOBAL:动态库中定义的符号可被其后打开的其它库解析。
--RTLD_LOCAL:与RTLD_GLOBAL作用相反,动态库中定义的符号不能被其后打开的其它库重定位。
如果没有指明是RTLD_GLOBAL还是RTLD_LOCAL,则缺省为RTLD_LOCAL。
--RTLD_NODELETE:在dlclose()期间不卸载库,并且在以后使用dlopen()重新加载库时不初始化库中的静态变量。
--RTLD_NOLOAD:不加载库。可用于测试库是否已加载(dlopen(