¿Qué es el truco LD_PRELOAD?

4 minutos de lectura

avatar de usuario
madeja gay

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

Sospecho que puede ser esto, pero no estoy seguro.

  • Realmente no es una respuesta, así que no la publicaré como tal, pero… Stephen Kell está usando LD_PRELOAD para su biblioteca liballocs en este video y si mira los fragmentos anteriores, puede comprender mejor cómo y por qué. Liballocs parece estar siendo utilizado para que otros lenguajes dinámicos puedan comunicarse entre sí. Esta charla tiene algunos aspectos internos profundos explicados en ella. youtu.be/LwicN2u6Dro?t=24m10s

    – Elías Lynn

    29 de febrero de 2016 a las 12:30


avatar de usuario
Josué

Puede anular símbolos en las bibliotecas estándar 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.

  • “Algunas personas lo usan para especificar bibliotecas en ubicaciones no estándar”… ¿En serio? ¡Suena como “Algunas personas lo usan mal”!

    – Tomás

    10 de junio de 2011 a las 7:52

  • LD_PRELOAD puede, en virtud del orden de carga, interceptar rutas codificadas especificadas por la aplicación.

    – Josué

    10 de junio de 2011 a las 16:05

  • ¿Sería un mal uso precargar otro versión de una biblioteca, suponiendo que sean compatibles?

    – z0r

    26 de noviembre de 2013 a las 7:17

  • Lo he visto usado para cargar una variante instrumentada o de depuración, o para cargar una biblioteca que hace algo completamente diferente de la biblioteca base como para emular algún otro sistema.

    – Josué

    26 de noviembre de 2013 a las 15:35

  • En el caso de que las bibliotecas no se compilen correctamente (solía encontrarse con mysql todo el tiempo donde tenía un acoplamiento flojo con un libmysql_client genérico que sobrescribía el enlace simbólico de una versión anterior, según la versión de Perl que usara, tenía que especificar / forzarlo con LD_PRELOAD… truco útil. Si no recuerdo mal, valgrind usa esta técnica para proporcionar la capacidad de depuración de archivos binarios sin necesidad de recompilar… es bastante útil.

    – sintetizador patel

    27 de febrero de 2014 a las 10:04

avatar de usuario
ronny brendel

Con LD_PRELOAD 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án en lugar de los estándar.

  • pero ¿y si el programa usa calloc? ¿Eso no estropearía todo?

    – Janus Troelsen

    30 de septiembre de 2014 a las 13:13

  • @JanusTroelsen si la biblioteca que escribe no implementa una determinada parte, esa parte se cargaría desde la biblioteca original.

    –Woodrow Barlow

    1 oct 2014 a las 14:42

  • @JanusTroelsen, en otras palabras, LD_PRELOAD le permite especificar qué implementación de un determinado símbolo se acostumbra Si la biblioteca precargada no exporta un símbolo, se encontrará en otro lugar.

    – sherrellbc

    06/04/2017 a las 22:47

  • @JanusTroelsen: Resulta que malloc y gratis están diseñados específicamente 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.

    – Josué

    26 de junio de 2019 a las 17:36

avatar de usuario
kalle richter

LD_PRELOAD enumera las bibliotecas compartidas con funciones que anulan el conjunto estándar, al igual que /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 anulado y configurando LD_PRELOAD; las funciones en este archivo de objeto anularán solo esas funciones dejando otras como estaban.

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

  • pero ¿y si el programa usa calloc? ¿Eso no estropearía todo?

    – Janus Troelsen

    30 de septiembre de 2014 a las 13:13

  • @JanusTroelsen si la biblioteca que escribe no implementa una determinada parte, esa parte se cargaría desde la biblioteca original.

    –Woodrow Barlow

    1 oct 2014 a las 14:42

  • @JanusTroelsen, en otras palabras, LD_PRELOAD le permite especificar qué implementación de un determinado símbolo se acostumbra Si la biblioteca precargada no exporta un símbolo, se encontrará en otro lugar.

    – sherrellbc

    06/04/2017 a las 22:47

  • @JanusTroelsen: Resulta que malloc y gratis están diseñados específicamente 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.

    – Josué

    26 de junio de 2019 a las 17:36

Exportar mylib.so a env:

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

Para desactivarlo:

$ unset LD_PRELOAD

  • o unset LD_PRELOAD

    – Morten

    18 de junio de 2019 a las 7:25

  • unset y export VAR= no son exactamente lo mismo. unset es el camino a seguir.

    – Michael Leon

    9 de noviembre de 2021 a las 14:10

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad