Подтвердить что ты не робот

Как определяются пути зависимости общих библиотек от 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/

Еще одна вещь меня озадачивает:

У меня есть общая библиотека, которую я компилирую из источника. Это зависит от libmysqlclient_r. Компилятор 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)

Однако в каталоге /usr/lib/mysql я вижу:

-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.

Мой дистрибутив Linux - CentOS 6.0 x86-32bit.

4b9b3361

Ответ 1

Вы можете видеть, какие пути идут от того, где:

LD_DEBUG=libs ldd ./libphp5.so

Являются ли эти имена и пути файлов зависимостей (/usr/lib/mysql/libmysqlclient.so.16) запеченными в двоичной библиотеке общей библиотеки?

Имя файла почти наверняка. Обычно это путь. Вы можете увидеть, что запечено в двоичном формате с помощью

readelf -d ./libphp5.so

Найдите записи (NEEDED) и (RPATH).

Также дайте man ld.so прочитанное. Существует множество факторов, влияющих на то, как динамический загрузчик выполняет поиск разделяемых библиотек: ld.so.conf, LD_LIBRARY_PATH, является ли исполняемый файл suid или нет, как настроен glibc, какие параметры -rpath были указаны во время ссылки и т.д. и др.

Ответ 2

Являются ли эти имена и пути файлов зависимостей (/usr/lib/mysql/libmysqlclient.so.16) запеченными в двоичной библиотеке общей библиотеки?

Да, они могут быть и часто. Ключевое слово здесь -rpath. Тем не менее, ld.conf также имеет свое мнение. К сожалению, вся система довольно сложная.