¿Sabía Usted que es posible remplazar por completo las funciones de la librería estándar con copias personalizadas? o.O Este corto artículo trata un tema que, de ser bien utilizado , puede resultar muy poderoso . Podrá conocer lo que se logra con la variable de entorno LD_PRELOAD en GNU/Linux . ¿Qué cosa es ese bicho? No muerde :) . Le invito a seguir leyendo este artículo y suscribirse a este blog mediante RSS para estar informado acerca de temas avanzados de programación y uso de los comandos del shell de los sistemas Unix .
LD_PRELOAD en acción
A modo de ejemplo vamos a cambiar la función fopen y utilizar nuestra propia copia . Lo mismo se puede hacer con otras funciones e.g. printf , scanf , ... Comencemos con un programa simple (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; }
En pocas palabras solamente invocamos la función estándar fopen y chequeamos el valor de retorno . Vamos a compilar y ejecutar .
$ ls prog.c test.txt $ gcc prog.c -o prog $ ls prog prog.c test.txt $ ./prog Calling the fopen() function... fopen() succeeded
Por otra parte compilamos una versión personalizada de la función fopen y la distribuimos por separado :
#include <stdio.h> FILE *fopen(const char *path, const char *mode) { printf("Always failing fopen\n"); return NULL; }
Llamamos a este fichero nullfopen.c y lo compilamos como una librería nullfopen.o .
$ gcc -Wall -fPIC -shared -o nullfopen.so nullfopen.c
Ahora ya estamos listos para modificar LD_PRELOAD :
$ LD_PRELOAD=./nullfopen.so ./prog Calling the fopen() function... Always failing fopen fopen() returned NULL
Como se puede constatar se remplazó fopen con una versión que siempre falla . Este truco es muy útil para depurar aplicaciones o remplazar ciertas partes de libc u otra librería que utilice la aplicación . Un uso práctico notable es el comando tsocks , utilizado para dotar las aplicaciones con la capacidad de conectarse a través de un proxy .
Espero tener tiempo pronto y escribir otro artículo acerca de la mecánica interna que hace posible los resultados que se obtienen con la variable LD_PRELOAD . Si está interesado en conocer más acerca de los sistemas Unix le invito a leer otros artículos sobre comandos y suscribirse a este blog mediante RSS para estar al tanto de nuevos temas . Si tiene preguntas no dude en dejar un comentario . Todo es posible simelo pide ...
No hay comentarios:
Publicar un comentario