2012-06-05 17 views
7

Tengo efectos secundarios extraños al cambiar LD_LIBRARY_PATH.LD_LIBRARY_PATH efectos secundarios

Cuando agrego una ruta que contiene una biblioteca, p. :

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 

Entonces, todo se vuelve increíblemente lento. Por ejemplo, un simple ls puede durar 10 segundos.

ldd salida es exactamente el mismo antes y después del cambio LD_LIBRARY_PATH y me trató de depurar la ejecución de la lenta ls con strace: Me da la misma ejecución exacta en ambos casos. La ejecución ni siquiera se atasca durante la ejecución de ls (ya que strace no genera nada durante el retardo de 10 segundos y de repente ejecuta perfectamente ls). Así que pensé que podría provenir de mi caparazón, pero esto es lo mismo, ejecutando strace en mi bash y ejecutando ls en ambos casos me da la misma salida strace: el shell ejecuta ls y espera el final de su ejecución (el último strace salida antes del rezago strace es waitpid(...)). Así que supongo que ocurre algo incorrecto entre el lanzamiento de ls y su ejecución, como si se tratara de un problema de núcleo. Realmente funciona como si se hubiera hecho sleep en ls (uso de 0 cpu).

Durante el retraso, mi CPU y la actividad de la red son perfectamente normales ...

Tenga en cuenta que la biblioteca en la nueva ruta de LD no entre en conflicto con cualquier "librería estándar", por lo que no molesta en mi ls ejemplo.

Así que soy interesante en explicaciones más profundas acerca de los efectos secundarios LD_LIBRARY_PATH o cómo depurar profundamente mi ejemplo.

+0

Buena pregunta. He usado 'LD_LIBRARY_PATH' y nunca he visto tal comportamiento, sin embargo, su observación parece a la vez aislada y clara. Interesante. – thb

+7

'export LD_DEBUG = all' y' man 8 ld.so' –

+0

propably obvio pero "ldd $ (which ls)" puede dar una pista si ls usa algo de LD_LIBRARY_PATH. – Matthias

Respuesta

0

No estoy seguro de qué más hay en su biblioteca LD_LIBRARY_PATH que está tratando de agregar o qué programa está ejecutando, pero probablemente sea mejor que escriba una secuencia de comandos contenedora para cambiar LD_LIBRARY_PATH solo para el programa que necesita el extra biblioteca para que las funciones de su sistema como ls no se vean afectadas.

#!/bin/bash 
export LD_LIBRARY_PATH=/my_path/lib 
program_name 

Crear archivo y chmod +x wrapper_name

+1

Sí, estoy de acuerdo contigo, pero solo soy una víctima de un sistema de compilación existente ... –

1

Este post es dejar de fumar de edad, así que no sé si ya encontrar una solución. De todos modos, no sé si esto puede ayudar, pero en la mayoría de los sistemas GNU/Linux modernos, el uso de LD_LIBRARY_PATH está en desuso y desaconsejado.

por lo tanto tengo un par de sugerencias:

  1. si desea seguir utilizándolo, tratan por primera vez por dejar pendiente con anterioridad en lugar de añadir a su ruta de bibliotecas LD_LIBRARY_PATH. Esto debería ayudar si hay algo que lleva mucho tiempo escanear la ruta en los directorios de la biblioteca anterior.

  2. Utilice el sistema LDCONFIG, que es la (nueva) manera correcta de utilizar LD directorios hoy en día. Simplemente tiene que agregar la ruta a su biblioteca en el archivo /etc/ld.so.conf, o mejor, agregue un archivo en /etc/ld.so.conf.d/que contiene la ruta de acceso a su biblioteca (se originará si hay una directiva de inclusión en /etc/ld.so.conf, que generalmente es el caso por defecto). Luego ejecute sudo ldconfig para actualizar la ruta de búsqueda LD del sistema.

Espero que esta ayuda. Saludos

Cuestiones relacionadas