¿Cuál es el truco LD_PRELOAD?
-
06-07-2019 - |
Solución
Si configura LD_PRELOAD
en la ruta de un objeto compartido, ese archivo se cargará antes de cualquier otra biblioteca (incluido el tiempo de ejecución C, libc.so
). Entonces, para ejecutar ls
con su implementación especial malloc ()
, haga esto:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
Otros consejos
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 prioridad a las bibliotecas.
Por ejemplo, puede escribir una biblioteca que implemente malloc
y free
. Y al cargarlos con LD_PRELOAD
su malloc
y free
se ejecutarán en lugar de los estándares.
Como muchas personas mencionaron, usar LD_PRELOAD
para precargar la biblioteca. Por cierto, puede COMPROBAR si la configuración está disponible mediante el comando ldd
.
Ejemplo: suponga 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
Verifique su biblioteca nuevamente:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
LD_PRELOAD
enumera las bibliotecas compartidas con funciones que anulan el conjunto estándar, tal como lo hace /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 sobresaliente y configurando LD_PRELOAD
; las funciones en este archivo de objeto anularán solo aquellas funciones dejando a otras como estaban.
Para obtener más información sobre bibliotecas compartidas, visite http://tldp.org/HOWTO/Program-Library-HOWTO/ shared-bibliotecas.html
es fácil exportar mylib.so
a env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
para deshabilitar:
$ export LD_PRELOAD=
Aquí hay una publicación de blog detallada sobre la precarga:
https://blog.cryptomilk.org/2014/07 / 21 / what-is-preloading /
Utilizando la ruta LD_PRELOAD
, puede forzar al cargador de aplicaciones 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 usado para hackear ciertas aplicaciones, anulando las funciones existentes usando objetos compartidos preparados.
cuando se utiliza LD_PRELOAD ese archivo se cargará antes que cualquier otro
$ export LD_PRELOAD = / path / lib
lib para precargarse, incluso esto también se puede usar en programas