2012-07-19 34 views
8

Tôi là người mới sử dụng Linux (đến từ nền Windows). Tôi muốn hiểu chi tiết về cách các đối tượng được chia sẻ (các tệp .so) được tải khi chạy. Theo http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html, tệp /etc/ld.so.conf định cấu hình các thư mục để tìm kiếm các tệp .so khi chạy. Tuy nhiên, một thử nghiệm được hiển thị bên dưới dường như chỉ ra rằng không phải như vậy./usr/local/lib là một trong các tệp .conf trong /etc/ld.so.conf.d, nhưng khi .so của tôi nằm trong thư mục/usr/local/lib, không tìm thấy tại thời gian chạy. Ngược lại/usr/lib là không phải được định cấu hình bởi /etc/ld.so.conf, nhưng khi của tôi .so nằm trong/usr/lib thì được tìm thấy khi chạy..so đường dẫn tìm kiếm

Tôi đang thiếu gì?

Cảm ơn, 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]:/$ 

Trả lời

10

/usr/lib và/lib được mã hóa IIRC.

Và thêm một PATH trong ld.conf.so không phải là enougth, bạn phải tạo lại bộ nhớ cache và các liên kết, sử dụng ldconfig (8)

Bạn có thể kiểm tra thư viện là trong bộ nhớ cache với ldconfig -p .

Các vấn đề liên quan