Averigüe si la biblioteca está en camino

14

Suponiendo que quiero probar si una biblioteca está instalada y utilizable por un programa. Puedo usar ldconfig -p | grep mylibpara averiguar si está instalado en el sistema. pero ¿qué pasa si la biblioteca solo se conoce a través de la configuración LD_LIBRARY_PATH?

En ese caso, el programa puede encontrar la biblioteca, pero ldconfigno lo hará. ¿Cómo puedo verificar si la biblioteca está en la ruta de enlace combinada ?

Agregaré que estoy buscando una solución que funcione incluso si realmente no tengo el programa a mano (por ejemplo, el programa aún no está compilado), solo quiero saber que existe cierta biblioteca en ld' s caminos.

nbubis
fuente
2
Puede usar ldd <binary>para verificar si todas las bibliotecas vinculadas están en la ruta. Quizás haya una manera más elegante.
Thomas
@ Thomas Creo que deberías responder tu comentario. lddcumple exactamente este propósito.
lgeorget
1
@Thomas, pero ¿qué pasa si el programa aún no está compilado y esa biblioteca es necesaria para la compilación?
nbubis
@Igeorget - vea mi edición / comentario
nbubis
@nbubis: cuando necesita la biblioteca para la compilación, normalmente tiene que usar LIBRARY_PATHla variable de entorno que busca, por ejemplo, el gcccompilador. La LIBRARY_PATHvariable de entorno también tiene una lista de directorios separados por dos puntos.
Thomas

Respuestas:

14

ldconfig puede enumerar todas las bibliotecas a las que tiene acceso. Estas bibliotecas también se almacenan en su caché.

/sbin/ldconfig -v -Nrastreará todas las rutas de biblioteca habituales, enumerará todas las bibliotecas disponibles, sin reconstruir la memoria caché (lo que no es posible si no es un usuario root). NO tiene en cuenta las bibliotecas en LD_LIBRARY_PATH (contrariamente a lo que dijo esta publicación antes de editar), pero puede pasar bibliotecas adicionales a la línea de comandos utilizando la línea a continuación:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
lgeorget
fuente
ldconfig es una herramienta de la década de 1980 que se abandonó en la década de 1990. Por este motivo, ldconfigno es portátil, ya que solo se aplica a implementaciones basadas en el a.outvinculador dinámico basado en SunOS-4.0 de 1987.
2016
¿Cómo ayuda eso a enumerar libs que solo están en LD_LIBRARY_PATH? Supongo que podría escribir un guión para analizar eso y luego leerlo a través de ldconfig, pero parece un poco como una muerte excesiva.
nbubis
1
@nbubis siempre puede pasar las bibliotecas en LD_LIBRARY_PATH a ldconfig. /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)No me gusta demasiado para mi gusto.
lgeorget
@Schily ¿En serio? Funciona bastante bien con las bibliotecas ELF por lo que puedo decir. Y todavía se usa, ld.so se basa en el caché creado por ldconfig.
lgeorget
La gente de Linux hackeó el antiguo código fuente del enlazador Sun para soportar ELF. La nueva implementación de ELF de Sun se eliminó ldconfigen un acuerdo con AT&T ya que el almacenamiento en caché del enlazador era demasiado sensible a los errores. Sun agregó más adelante the tree stooges: moe, lariy crlecomo los programas de ayuda para la gestión de ELF.
schily
2

Sustituya (espacio) globalmente :con LD_LIBRARY_PATH

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
fizwit
fuente
2

Puede compilar un programa de prueba simple con gcc y vincular su biblioteca. Luego puede verificar las bibliotecas usadas con ldd. Yo uso algo como esto:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed evita que el vinculador descarte la biblioteca, porque no se utilizan símbolos de la biblioteca.

guini
fuente