2011-11-17 13 views
13

Cuando corro ldd contra una biblioteca compartida como libphp5.so veo que tiene una dependencia en libmysqlclient.so.16:¿Cómo se determinan las rutas de dependencia de bibliotecas compartidas en Linux?

 
$ ldd ./libphp5.so 
libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16 
[other dependencies snipped out] 

Son estos los nombres de archivo de dependencia y caminos (/usr/lib/mysql/libmysqlclient.so.16) al horno en el binario de biblioteca compartida? O es este camino determinado por algún otro medio, como a través de /etc/ld.so.conf.d/mysql-i386.conf, que contiene dicho sea de paso:

/usr/lib/mysql/ 

Otra cosa que me es desconcertante:

hay una biblioteca compartida que tengo que puedo compilar desde las fuentes. Esto tiene una dependencia en libmysqlclient_r. Los gcc modificadores del compilador para producir este aspecto esta biblioteca como:

 
gcc -shared -L/usr/lib/mysql -lmysqlclient_r [+various other switches] 

Cuando hago ldd mylib.so veo:

 
libmysqlclient_r.so.16 => /usr/lib/mysql/libmysqlclient_r.so.16 (0x0055c000) 

Sin embargo, en el directorio /usr/lib/mysql veo:

 
-rwxr-xr-x. libmysqlclient_r.so -> libmysqlclient_r.so.16.0.0 
lrwxrwxrwx. libmysqlclient_r.so.16 -> libmysqlclient_r.so.16.0.0 
-rwxr-xr-x. libmysqlclient_r.so.16.0.0 
lrwxrwxrwx. libmysqlclient.so -> libmysqlclient.so.16.0.0 
lrwxrwxrwx. libmysqlclient.so.16 -> libmysqlclient.so.16.0.0 
-rwxr-xr-x. libmysqlclient.so.16.0.0 

libmysqlclient_r.so es un enlace simbólico a libmysqlclient_r.so.16.0.0, entonces ¿por qué ldd muestra la dependencia como libmysqlclient_r.so.16. ¿Hay algo de magia que me falta aquí?

Después de haber sido un desarrollador de Windows durante muchos años, soy un poco nuevo en gcc y desarrollo en Linux.

Mi distribución de Linux es CentOS 6.0 x86-32bit.

Respuesta

14

Se puede ver qué rutas están llegando desde donde ejecutando

LD_DEBUG=libs ldd ./libphp5.so 

¿Son estos los nombres de archivo de dependencia y caminos (/usr/lib/mysql/libmysqlclient.so.16) al horno en el binario biblioteca compartida ?

El nombre de archivo es casi seguro. El camino generalmente no es. Se puede ver lo que se cuece en el binario con

readelf -d ./libphp5.so 

Busque (NEEDED) y (RPATH) entradas.

También conceda man ld.so una lectura.Hay muchos factores que afectan a la forma en búsquedas cargador dinámicos para las bibliotecas compartidas: ld.so.conf, LD_LIBRARY_PATH, si el ejecutable es suid o no, ¿cómo se ha configurado glibc, que se les dio -rpath ajustes en tiempo de enlace, etc. etc.

+0

Gracias, eso es algunos consejos útiles. – Kev

+0

No tiene idea, pero me gustaría poder recomendar esto aún más. Mi pregunta surgió de la imposibilidad de cargar 'libmysqlclient_r' utilizado en un paquete de tienda de queso de Python (MySQL-Python) a pesar de que compila/construye muy bien. 'LD_DEBUG = libs ldd' era mi vida más segura. Resulta que el archivo de ruta guardado en '/ etc/ld.co.conf.d' no terminó en' .conf' y mi archivo '/ etc/ld.so.conf' especifica:' include ld.so. conf.d/*. conf'. Por lo tanto, nunca se realizó una búsqueda en la carpeta '/ usr/lib/mysql'. – Kev

1

¿Están estos nombres y rutas de acceso de dependencia (/usr/lib/mysql/libmysqlclient.so.16) integrados en el binario de la biblioteca compartida?

Sí, pueden ser y son a menudo. La palabra clave aquí es -rpath. Sin embargo, ld.conf también tiene su voz. Todo el sistema es bastante complejo, desafortunadamente.

Cuestiones relacionadas