Как определяются пути зависимостей общей библиотеки в 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 также имеет свое слово. К сожалению, вся система довольно сложна.