2011-11-17 20 views
13

Kiedy biegnę ldd przeciwko udostępnionej biblioteki takie jak libphp5.so widzę, że ma uzależnienia od libmysqlclient.so.16:W jaki sposób określa się ścieżki zależności bibliotek współdzielonych w systemie Linux?

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

są te nazwy plików i ścieżki z zależnościami (/usr/lib/mysql/libmysqlclient.so.16) pieczone w udostępnionej biblioteki binarnym? Czy jest to ścieżka określona za pomocą innych środków, takich jak poprzez /etc/ld.so.conf.d/mysql-i386.conf, które nawiasem mówiąc zawiera:

/usr/lib/mysql/ 

Jedną rzeczą jest zastanawiające mnie:

Istnieje wspólna biblioteka mam, że mogę skompilować ze źródeł. Jest to zależne od libmysqlclient_r. W gcc przełączniki kompilatora produkować ten wygląd tej biblioteki jak:

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

Kiedy zrobić ldd mylib.so widzę:

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

Jednak w katalogu /usr/lib/mysql widzę:

 
-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 jest symboliczny link do libmysqlclient_r.so.16.0.0, dlaczego więc ldd pokazuje zależność jako libmysqlclient_r.so.16. Czy jest tu trochę magii?

Będąc programistą dla systemu Windows od wielu lat jestem trochę nowy w stosunku do gcc i rozwoju w systemie Linux.

Moja dystrybucja Linuksa to CentOS 6.0 x86-32bit.

Odpowiedz

14

Można sprawdzić, które ścieżki idą skąd uruchamiając

LD_DEBUG=libs ldd ./libphp5.so 

Czy te nazwy plików i ścieżki z zależnościami (/usr/lib/mysql/libmysqlclient.so.16) pieczone w udostępnionej biblioteki binarnym ?

Nazwa pliku prawie na pewno. Ścieżka zwykle nie jest. Można zobaczyć, co jest pieczony w binarny z

readelf -d ./libphp5.so 

Poszukaj (NEEDED) i (RPATH) wpisów.

Podaj także man ld.so czytać.Istnieje wiele czynników, które wpływają na to jak dynamiczne wyszukiwanie załadunku dla współdzielonych bibliotek: ld.so.conf, LD_LIBRARY_PATH, czy plik wykonywalny jest suid czy nie, jak glibc została skonfigurowana, który -rpath ustawienia zostały podane w czasie łącza itp itd

+0

Dzięki, że to kilka przydatnych wskazówek. – Kev

+0

Nie masz pojęcia, ale chciałabym móc to powtórzyć jeszcze bardziej. Moje pytanie wynikało z tego, że nie mogłem załadować 'libmysqlclient_r' używanego w pakiecie Pythona do serów (MySQL-Python), mimo że kompilowanie/budowanie było w porządku. 'LD_DEBUG = libs ldd' było moim życiem bezpieczniejszym. Okazuje się, że plik ścieżki zapisany w pliku '/ etc/ld.co.conf.d' nie zakończył się na' .conf', a mój plik '/ etc/ld.so.conf' określa:' include ld.so. conf.d/*. conf'. Tak więc folder '/ usr/lib/mysql' nigdy nie był wyszukiwany. – Kev

1

Czy te nazwy plików i ścieżki z zależnościami (/usr/lib/mysql/libmysqlclient.so.16) pieczone w udostępnionej biblioteki binarnym?

Tak, mogą być i często są. Słowo kluczowe tutaj to -rpath. Jednak ld.conf również ma swoje zdanie. Niestety, cały system jest dość skomplikowany.

Powiązane problemy