Pregunta

Recientemente me encontré con una referencia en proggit y (a partir de ahora) no se explica.

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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top