下面的helloworld会在屏幕上打印出什么内容?
1
2
3
4
5
6
|
#include <stdio.h> int main( int argc, char * argv[], char * env[])
{ printf ( "Hello World!\n" );
return 0;
} |
肯定是“Hello World!”,不是吗?下面我们来个托梁换柱:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
preload.c #include <stdio.h> #include <ctype.h> int puts ( const char *s)
{ const char * p = s;
while (*p != '\0' )
{
putc ( toupper (*p), stdout);
p++;
}
return 0;
} |
编译:
gcc -g -shared preload.c -o libpreload.so
按下列方式运行helloworld:
LD_PRELOAD=./libpreload.so ./helloworld
屏幕打印:
HELLO WORLD!
设置环境变量LD_PRELOAD之后,打印的内容变成大写了!原来,LD_PRELOAD指定的
共享库被预先加载,如果出现重名的函数,预先加载的函数将会被调用。通过这种方法,我
们可以在不需要修改源代码(有时候可能没有源代码)的情况下,来改变一个程序的行为。