Как определяются пути зависимостей общей библиотеки в Linux?
когда я запускаю ldd
против общей библиотеки, такой как libphp5.so
Я вижу, что он имеет зависимость от libmysqlclient.so.16
:
$ ldd ./libphp5.so libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16 [other dependencies snipped out]
являются ли эти имена файлов зависимостей и пути (/usr/lib/mysql/libmysqlclient.so.16
) запеченный в двоичный файл общей библиотеки? Или этот путь определяется какими-то другими способами, например через /etc/ld.so.conf.d/mysql-i386.conf
, который, кстати, содержит:
/usr/lib/mysql/
еще одна вещь меня озадачивает:
у меня есть общая библиотека, которую я компилирую из исходного кода. Это зависимость on libmysqlclient_r
. The gcc
переключатели компилятора для создания этой библиотеки выглядят так:
gcc -shared -L/usr/lib/mysql -lmysqlclient_r [+various other switches]
когда я делаю ldd mylib.so
я вижу:
libmysqlclient_r.so.16 => /usr/lib/mysql/libmysqlclient_r.so.16 (0x0055c000)на Я вижу:
-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
является символической ссылкой на libmysqlclient_r.so.16.0.0
, почему ldd
показать зависимость как libmysqlclient_r.so.16
. Есть какая-то магия, которой мне не хватает?
будучи разработчиком Windows в течение многих лет, я немного новичок в gcc
и разработки в Линукс.
мой дистрибутив Linux-CentOS 6.0 x86-32bit.
2 ответов
вы можете увидеть, какие пути идут откуда, запустив
LD_DEBUG=libs ldd ./libphp5.so
являются ли эти имена файлов зависимостей и пути (/usr/lib/mysql / libmysqlclient.Итак.16) запеченный в двоичный файл общей библиотеки?
имя файла, почти наверняка. Обычно это не так. Вы можете увидеть, что запечено в двоичный файл с
readelf -d ./libphp5.so
искать (NEEDED)
и (RPATH)
записи.
также дать man ld.so
читать. Есть много факторов, которые влияет на то, как динамический загрузчик ищет общие библиотеки:ld.so.conf
, LD_LIBRARY_PATH
, является ли исполняемый файл suid
или нет, как был настроен glibc, который
являются ли эти имена файлов зависимостей и пути (/usr/lib/mysql / libmysqlclient.Итак.16) запеченный в двоичный файл общей библиотеки?
Да, они могут быть и часто являются. Ключевое слово здесь -rpath
. Однако, ЛД.conf также имеет свое слово. К сожалению, вся система довольно сложна.