¿Cuál es el truco LD_PRELOAD?

Encontré una referencia a él recientemente en proggit y (a partir de ahora) no se explica.

Sospecho que esto podría ser, pero no estoy seguro.

Si configura LD_PRELOAD en la ruta de un objeto compartido, ese archivo se cargará antes que cualquier otra biblioteca (incluido el tiempo de ejecución de C, libc.so ). Entonces, para ejecutar ls con su implementación especial de malloc() , haga esto:

 $ LD_PRELOAD=/path/to/my/malloc.so /bin/ls 

Puede anular símbolos en las bibliotecas de valores creando una biblioteca con los mismos símbolos y especificando la biblioteca en LD_PRELOAD .

Algunas personas lo usan para especificar bibliotecas en ubicaciones no estándar, pero LD_LIBRARY_PATH es mejor para ese propósito.

Con LD_PRELOAD puede dar precedencia a las bibliotecas.

Por ejemplo, puede escribir una biblioteca que implemente malloc y free . Y al cargar estos con LD_PRELOAD su malloc y free lugar de los estándar.

Como mucha gente mencionó, usar LD_PRELOAD para precargar la biblioteca. Por cierto, puede CHECK si la configuración está disponible mediante el comando ldd .

Ejemplo: supongamos que necesita precargar su propio libselinux.so.1 .

 > ldd /bin/ls ... libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000) libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000) libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000) /lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000) libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000) 

Por lo tanto, configure su entorno de precarga:

  export LD_PRELOAD=/home/patric/libselinux.so.1 

Revisa tu biblioteca de nuevo:

 >ldd /bin/ls ... libselinux.so.1 => /home/patric/libselinux.so.1 (0x00007fb9245d8000) ... 

LD_PRELOAD enumera bibliotecas compartidas con funciones que anulan el conjunto estándar, al igual que /etc/ld.so.preload . Estos son implementados por el cargador /lib/ld-linux.so . Si desea anular solo algunas funciones seleccionadas, puede hacerlo creando un archivo de objeto de reemplazo y configurando LD_PRELOAD ; las funciones en este archivo de objeto anularán esas funciones dejando a los demás como estaban.

Para obtener más información sobre las bibliotecas compartidas, visite http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

es fácil exportar mylib.so a env:

 $ export LD_PRELOAD=/path/mylib.so $ ./mybin 

deshabilitar :

 $ export LD_PRELOAD= 

Aquí hay una publicación detallada del blog sobre la precarga:

https://blog.cryptomilk.org/2014/07/21/what-is-preloading/

Al LD_PRELOAD ruta LD_PRELOAD , puede forzar al cargador de la aplicación a cargar el objeto compartido proporcionado, por encima del valor predeterminado proporcionado.

Los desarrolladores usan esto para depurar sus aplicaciones al proporcionar diferentes versiones de los objetos compartidos.

Lo hemos utilizado para hackear ciertas aplicaciones, anulando funciones existentes utilizando objetos compartidos preparados.