2012-07-19 14 views
8

Jestem nowicjuszem systemu Linux (pochodzącym z systemu Windows). Chciałbym zrozumieć szczegóły dotyczące sposobu ładowania obiektów współużytkowanych (pliki .so) w środowisku wykonawczym. Zgodnie z http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html plik /etc/ld.so.conf konfiguruje katalogi do wyszukiwania plików .so w środowisku wykonawczym. Jednak eksperyment przedstawiony poniżej wydaje się wskazywać, że tak nie jest./usr/local/lib znajduje się w jednym z plików .conf w /etc/ld.so.conf.d, ale gdy mój .so znajduje się w katalogu/usr/local/lib, nie można go znaleźć w czasie wykonywania. Odwrotnie/usr/lib jest nie skonfigurowany przez /etc/ld.so.conf, ale gdy mój .so jest w/usr/lib to jest znaleziony w czasie wykonywania..to ścieżki wyszukiwania

Czego mi brakuje?

Dzięki, 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]:/$ 

Odpowiedz

10

/usr/lib i/lib są sztywno IIRC.

i dodanie ścieżka w ld.conf.so nie jest enougth, trzeba regenerować pamięć podręczną i linki, używając ldconfig (8)

Można sprawdzić, które biblioteki są w pamięci podręcznej z ldconfig -p .

Powiązane problemy