LD_PRELOAD是unix下的一个环境变量,用来加载动态库的,动态库的加载顺序为LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib。一般情况下,我们的程序都会用到很多库函数,只要是动态库的函数,都可以通过LD_PRELOAD 来让程序优先调用自定义的库函数,从而达到修改标准库函数的目的。下面的例子转载的:https://www.cnblogs.com/davad/p/4563478.html
测试代码test.c
-
#include <stdio.h>
-
#include <string.h>
-
-
int main(int argc, char *argv[])
-
{
-
if( strcmp(argv[1], "test") )
-
{
-
printf("Incorrect password\n");
-
}
-
else
-
{
-
printf("Correct password\n");
-
}
-
return 0;
-
}
自定义的库ldpreload.c
-
#include <stdio.h>
-
#include <string.h>
-
#include <dlfcn.h>
-
-
typedef int(*STRCMP)(const char*, const char*);
-
-
int strcmp(const char *s1, const char *s2)
-
{
-
static void *handle = NULL;
-
static STRCMP old_strcmp = NULL;
-
-
if( !handle )
-
{
-
handle = dlopen("libc.so.6", RTLD_LAZY);
-
old_strcmp = (STRCMP)dlsym(handle, "strcmp");
-
}
-
printf("hack function invoked. s1=<%s> s2=<%s>\n", s1, s2);
-
return old_strcmp(s1, s2);
-
}
编译测试代码:gcc -o test test.c
编译自定义动态库:gcc -fPIC -shared -o ldpreload.so ldpreload.c
运行结果如下图,可以看出输出结果多了自定义的strcmp中的打印信息,如果想保留库函数原来的功能,只是想添加一些特殊的处理,可以像这个例子这么做,如果想完全改写库函数,就直接自定义一个同名同参数的库函数,然后用LD_PRELOAD 环境变量来控制调用就好了
阅读(2650) | 评论(0) | 转发(0) |