- 论坛徽章:
- 0
|
10可用积分
我测试的代码如下:
cat test.c
#include<stdio.h>
#include<stdlib.h>
void hi(void)
{
printf("hi");
}
int main(void)
{
char *p;
setenv("LD_PRELOAD","./libmylib.so.1.0",1);
p=getenv("LD_PRELOAD");
printf("LD_PRELOAD:%s\n",p);
//hi();
printf("hello\n");
}
cat prog.c
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
/*
void _init()
{
unsetenv("LD_PRELOAD");
execl("./abc.sh","abc.sh","init",NULL);
}
*/
int printf(const char *s,...)
{
unsetenv("LD_PRELOAD");
execl("./abc.sh","abc.sh",s,NULL);
}
gcc test.c -o test
gcc -o prog.o -c prog.c -fPIC
gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0 prog.o -nostartfiles
我的测试的结果:
当前环境变量里没有LD_PRELOAD,执行./test 发现printf没有替换。
然后 我export LD_PRELOAD="./libmylib.so.1.0" 之后,再次执行./test,printf就被替换成我的共享库里的printf了
为什么test.c里的 setenv("LD_PRELOAD","./libmylib.so.1.0",1); 没起作用呢?
还有一个问题,对于共享库中_init 用法,我不是太明白,当我把注释取消的时候,什么时候_init 起作用? 好像只要执行函数调用,这个_init 就会起作用,为什么啊?那块知识是介绍这块东西的?谢谢各位给执教一下
还有,test.c中,有两个printf,export LD_PRELOAD="./libmylib.so.1.0" 之后,只看到t.txt 中有LD_PRELOAD:%s,没有看到hello,这个是为什么啊?
谢谢指点一下! |
|