下面的helloworld会在屏幕上打印出什么内容?
1
2
3
4
5
6
|
#include <stdio.h> int main( int argc, char * argv[], char * env[]) { printf ( "Hello World!
" ); 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 != ' ' ) { 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指定的
共享库被预先加载,如果出现重名的函数,预先加载的函数将会被调用。通过这种方法,我
们可以在不需要修改源代码(有时候可能没有源代码)的情况下,来改变一个程序的行为。