Как определяются пути зависимости разделяемой библиотеки в Linux? - PullRequest
13 голосов
/ 17 ноября 2011

Когда я запускаю 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.

Ответы [ 2 ]

14 голосов
/ 17 ноября 2011

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

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 были заданы во время соединения и т. Д. и т.д.

1 голос
/ 17 ноября 2011

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

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

...