Linux LD PRELOAD
What is LD_PRELOAD trick
If you set LD_PRELOAD to the path of a shared object, that file will be loaded before any other library (including the C runtime, libc.so). So to run ls with your special malloc() implementation, do this:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
A Simple LD_PRELOAD Tutorial
- CITING from http://www.catonmat.net/blog/simple-ld-preload-tutorial/ :
This is going to be a super short and super simple tutorial for beginners about LD_PRELOAD. If you're familiar with LD_PRELOAD, you'll learn nothing new. Otherwise keep reading!
Did you know you could override the C standard library's functions (such as printf, fopen, etc) with your own version of these functions in any program? In this article I'll teach you how this can be done through the LD_PRELOAD environment variable.
Let's start with a simple C program (prog.c):
#include <stdio.h> int main(void) { printf("Calling the fopen() function...\n"); FILE *fd = fopen("test.txt","r"); if (!fd) { printf("fopen() returned NULL\n"); return 1; } printf("fopen() succeeded\n"); return 0; }
The code above simply makes a call to the standard fopen function and then checks its return value. Now, let's compile and execute it:
$ ls prog.c test.txt $ gcc prog.c -o prog $ ls prog prog.c test.txt $ ./prog Calling the fopen() function... fopen() succeeded
Now let's write our own version of fopen and compile it as a shared library:
#include <stdio.h> FILE *fopen(const char *path, const char *mode) { printf("Always failing fopen\n"); return NULL; }
Let's call this file myfopen.c, and let's compile it as a shared library:
gcc -Wall -fPIC -shared -o myfopen.so myfopen.cNow we can simply modify LD_PRELOAD:$ LD_PRELOAD=./myfopen.so ./prog Calling the fopen() function... Always failing fopen fopen() returned NULLAs you can see the fopen got replaced with our own version that is always failing. This is really handy if you've to debug or replace certain parts of libc or any other shared library.