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_PRELOAD
la 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 ls
con 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_PATH
es mejor para ese propósito.
Con LD_PRELOAD
usted puede dar prioridad 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
se ejecutará en lugar de los estándar.
calloc
? ¿No lo estropearía todo?
malloc
y gratis están específicamente diseñados en glibc para permitir esto y el stock calloc
logra llamar a su importado malloc
. No intente esto con ninguna otra función. No funcionará tan bien.
Como muchas personas mencionaron, usar LD_PRELOAD
para precargar la biblioteca. Por cierto, puede VERIFICAR si la configuración está disponible por ldd
comando.
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_PRELOAD
enumera las bibliotecas compartidas con funciones que anulan el conjunto estándar, tal como lo /etc/ld.so.preload
hace. 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.so
a 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/lib
lib para cargarse previamente, incluso esto también se puede usar en programas
Usando la LD_PRELOAD
ruta, 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.