¿Cómo se especifica la ubicación de las bibliotecas a un binario? (Linux)

Para esta pregunta voy a estar utilizando un ejemplo específico, pero en realidad esto generaliza a casi cualquier binario en linux que no puede parecer encontrar sus bibliotecas dependientes. Por lo tanto, tengo un programa que no se ejecutará debido a las bibliotecas que faltan:

./cart5: error while loading shared libraries: libcorona-1.0.2.so: cannot open shared object file: No such file or directory 

Ldd arroja alguna luz sobre el tema:

 linux-vdso.so.1 => (0x00007fff18b01000) libcorona-1.0.2.so => not found libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so.6 (0x00007f0975830000) libm.so.6 => /lib/libm.so.6 (0x00007f09755af000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f0975399000) libc.so.6 => /lib/libc.so.6 (0x00007f0975040000) libz.so.1 => /lib/libz.so.1 (0x00007f0974e2b000) /lib64/ld-linux-x86-64.so.2 (0x00007f0975b36000) 

Sin embargo, corona está instalado:

 oliver@human$ find / -name libcorona-1.0.2.so 2> /dev/null /usr/local/lib64/libcorona-1.0.2.so /home/oliver/installed/corona-1.0.2/src/.libs/libcorona-1.0.2.so 

¿Cómo le digo al binario dónde buscar la biblioteca "que falta"?

Para una vez, establezca la variable LD_LIBRARY_PATH en una lista de directorios separados por dos puntos para buscar. Esto es análogo a PATH para ejecutables, excepto que los directorios estándar del sistema se buscan adicionalmente después de los especificados a través del entorno.

 LD_LIBRARY_PATH=/usr/local/lib64 ./cart5 

Si tiene un programa que mantiene las bibliotecas en una ubicación no estándar y no puede encontrarlas por sí mismo, puede escribir una secuencia de comandos de wrapper:

 #!/bin/sh if [ -n "$LD_LIBRARY_PATH" ]; then LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64 else LD_LIBRARY_PATH=/usr/local/lib64 fi export LD_LIBRARY_PATH exec /path/to/cart5 "$@" 

La lista de directorios estándar del sistema se mantiene en /etc/ld.so.conf . Los sistemas recientes permiten que este archivo incluya otros archivos; Si el suyo contiene algo como include /etc/ld.so.conf.d/*.conf , cree un nuevo archivo llamado /etc/ld.so.conf.d/mala.conf contiene los directorios que desea agregar. Después de cambiar /etc/ld.so.conf o un archivo incluido, ejecute /sbin/ldconfig para que los cambios surtan efecto (esto actualiza un caché).

( LD_LIBRARY_PATH también se aplica a muchos otros unices, incluyendo FreeBSD, NetBSD, OpenBSD, Solaris y Tru64. HP-UX tiene SHLIB_PATH y Mac OS X tiene DYLD_LIBRARY_PATH . /etc/ld.so.conf tiene análogos en la mayoría de los unices pero la ubicación y la sintaxis Difiere más ampliamente).

Si desea evitar LD_LIBRARY_PATH, también puede hacer esto, durante la vinculación:

 gcc -o exename -L/path/to/dynamiclib/ -lnameofLib \ -Wl,-R/path/to/dynamiclib/ sourceCode1.c ... 

El -Wl, … se utiliza para pasar comandos adicionales al vinculador y, en este caso, con -R le indica al enlazador que guarde esta ruta como "ruta de búsqueda predeterminada" para el .so.

Tengo notas de muchos pequeños consejos como éste, en mi sitio:

https://www.thanassis.space/tricks.html

    Intereting Posts