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.
Dzięki, że to kilka przydatnych wskazówek. – Kev
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