2012-07-19 11 views
8

Soy un principiante de Linux (procedente de un fondo de Windows). Me gustaría comprender los detalles de cómo se cargan los objetos compartidos (archivos .so) en tiempo de ejecución. De acuerdo con http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html, el archivo /etc/ld.so.conf configura los directorios para buscar archivos .so en tiempo de ejecución. Sin embargo, un experimento que se muestra a continuación parece indicar que no es el caso./usr/local/lib está en uno de los archivos .conf en /etc/ld.so.conf.d, pero cuando mi .so está en/usr/local/lib no se encuentra en tiempo de ejecución. Por el contrario/usr/lib es no configurado por /etc/ld.so.conf, pero cuando mi .so está en/usr/lib es encontrado en tiempo de ejecución..so rutas de búsqueda

¿Qué me estoy perdiendo?

Gracias a Dave,

[email protected]:/$ # Display the .so search path configured in /etc/ld.so.conf 
[email protected]:/$ cat /etc/ld.so.conf 
include /etc/ld.so.conf.d/*.conf 
[email protected]:/$ cat /etc/ld.so.conf.d/*.conf 
/usr/lib/mesa 
/usr/lib32/mesa 
/usr/lib32/alsa-lib 
/usr/lib/alsa-lib 
# libc default configuration 
/usr/local/lib 
# Multiarch support 
/lib/x86_64-linux-gnu 
/usr/lib/x86_64-linux-gnu 

[email protected]:/$ # libsotest.so.1 is in /usr/local/lib 
[email protected]:/$ ls -la /usr/local/lib/libsotest* 
lrwxrwxrwx 1 root root  14 2012-07-19 08:24 /usr/local/lib/libsotest.so -> libsotest.so.1 
lrwxrwxrwx 1 root root  18 2012-07-19 08:24 /usr/local/lib/libsotest.so.1 ->  libsotest.so.1.0.1 
-rwxr-xr-x 1 davids davids 7952 2012-07-19 08:13 /usr/local/lib/libsotest.so.1.0.1 

[email protected]:/$ # But when I run an executable that refrs to libsotest.so.1, the loader  doesn't find it. 
[email protected]:/$ /projects/sotest/exe/sotestexe 
/projects/sotest/exe/sotestexe: error while loading shared libraries: libsotest.so.1: cannot  open shared object file: No such file or directory 

[email protected]:/$ # Configure loader to display the paths it's searching...it's  searching /usr/lib but not /usr/local/lib 
[email protected]:/$ export LD_DEBUG=lib 
[email protected]:/$ /projects/sotest/exe/sotestexe 
warning: debug option `lib' unknown; try LD_DEBUG=help 
/projects/sotest/exe/sotestexe: error while loading shared libraries: libsotest.so.1: cannot  open shared object file: No such file or directory 
[email protected]:/$ export LD_DEBUG=libs 
[email protected]:/$ /projects/sotest/exe/sotestexe 
     6691: find library=libsotest.so.1 [0]; searching 
     6691: search cache=/etc/ld.so.cache 
     6691: search  path=/lib/tls/x86_64:/lib/tls:/lib/x86_64:/lib:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/x86_64:/usr/ lib:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux- gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux- gnu/tls:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu  (system search path) 
     6691: trying file=/lib/tls/x86_64/libsotest.so.1 
     6691: trying file=/lib/tls/libsotest.so.1 
     6691: trying file=/lib/x86_64/libsotest.so.1 
     6691: trying file=/lib/libsotest.so.1 
     6691: trying file=/usr/lib/tls/x86_64/libsotest.so.1 
     6691: trying file=/usr/lib/tls/libsotest.so.1 
     6691: trying file=/usr/lib/x86_64/libsotest.so.1 
     6691: trying file=/usr/lib/libsotest.so.1 
     6691: trying file=/lib/x86_64-linux-gnu/tls/x86_64/libsotest.so.1 
     6691: trying file=/lib/x86_64-linux-gnu/tls/libsotest.so.1 
     6691: trying file=/lib/x86_64-linux-gnu/x86_64/libsotest.so.1 
     6691: trying file=/lib/x86_64-linux-gnu/libsotest.so.1 
     6691: trying file=/usr/lib/x86_64-linux-gnu/tls/x86_64/libsotest.so.1 
     6691: trying file=/usr/lib/x86_64-linux-gnu/tls/libsotest.so.1 
     6691: trying file=/usr/lib/x86_64-linux-gnu/x86_64/libsotest.so.1 
     6691: trying file=/usr/lib/x86_64-linux-gnu/libsotest.so.1 
     6691: 
/projects/sotest/exe/sotestexe: error while loading shared libraries: libsotest.so.1: cannot  open shared object file: No such file or directory 
[email protected]:/$ 

Respuesta

10

/usr/lib y IIRC/lib están codificados.

Y la adición de un camino en ld.conf.so no es enougth, tiene que regenerar la memoria caché y los enlaces, usando ldconfig (8)

Puede comprobar qué biblioteca se encuentran en la memoria caché con -p ldconfig .

Cuestiones relacionadas