Me encontré con 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.
Me encontré con 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.
Respuestas:
Si establece LD_PRELOADla ruta de un objeto compartido, ese archivo se cargará antes que cualquier otra biblioteca (incluido el tiempo de ejecución C libc.so). Entonces, para ejecutar lscon su malloc()implementación especial , haga esto:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD. La razón es que, al ser una variable de entorno, la heredan los procesos secundarios, que pueden tener un directorio de trabajo diferente al proceso principal. Por lo tanto, cualquier ruta relativa no podría localizar la biblioteca para precargarla.
Puede anular los 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_PATHes mejor para ese propósito.
Con LD_PRELOADusted puede dar prioridad a las bibliotecas.
Por ejemplo, puede escribir una biblioteca que implemente mallocy free. Y al cargar estos con LD_PRELOADsu mallocy freese ejecutará en lugar de los estándar.
calloc? ¿No lo estropearía todo?
mallocy gratis están específicamente diseñados en glibc para permitir esto y el stock calloclogra llamar a su importado malloc. No intente esto con ninguna otra función. No funcionará tan bien.
Como muchas personas mencionaron, usar LD_PRELOADpara precargar la biblioteca. Por cierto, puede VERIFICAR si la configuración está disponible por lddcomando.
Ejemplo: suponga que necesita precargar el suyo 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_PRELOADenumera las bibliotecas compartidas con funciones que anulan el conjunto estándar, tal como lo /etc/ld.so.preloadhace. Estos son implementados por el cargador /lib/ld-linux.so. Si desea anular solo algunas funciones seleccionadas, puede hacerlo creando un archivo de objeto y configurandoLD_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 las bibliotecas compartidas, visite http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Aquí hay una publicación de blog detallada sobre la precarga:
es fácil exportar mylib.soa env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
deshabilitar :
$ export LD_PRELOAD=
unset LD_PRELOAD
cuando se utiliza LD_PRELOAD, ese archivo se cargará antes que cualquier otra
$export LD_PRELOAD=/path/liblib para cargarse previamente, incluso esto también se puede usar en programas
Usando la LD_PRELOADruta, 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.