До сих пор в наших примерах мы создавали разделяемые библиотеки в локальном пользовательском каталоге и затем задействовали переменную среды LD_LIBRARY_PATH, чтобы этот каталог была одним из тех, по которым динамический компоновщик выполняет поиск. Этот подход доступен как для обычных, так и для привилегированных пользователей, однако его не следует применять для реальных приложений. Обычно разделяемая библиотека вместе со всеми своими символьными ссылками устанавливается в один из стандартных каталогов — в частности, в один из следующих:
• /usr/lib — каталог, в который устанавливается большинство стандартных библиотек;
• /lib — в этот каталог следует устанавливать библиотеки, необходимые во время загрузки системы (так как на данном этапе каталог /usr/lib может быть еще недоступен);
• /usr/local/lib — в данный каталог следует устанавливать нестандартные и экспериментальные библиотеки (он также подходит в ситуациях, когда каталог /usr/lib подключается по сети и доступен сразу нескольким системам, а библиотеку при этом нужно установить локально);
• один из каталогов, перечисленных в файле /etc/ld.so.conf (который мы рассмотрим чуть ниже).
В большинстве случаев копирование файлов в любой из этих каталогов требует привилегий администратора.
После установки для soname и компоновочного имени должны быть созданы (относительные) символьные ссылки — обычно в том же каталоге, где находится сам файл библиотеки. Таким образом, чтобы установить демонстрационную библиотеку в /usr/lib (обновлять которую может только администратор), нужно выполнить следующие шаги:
$ su
Password:
# mv libdemo.so.1.0.1 /usr/lib
# cd /usr/lib
# ln — s libdemo.so.1.0.1 libdemo.so.1
# ln — s libdemo.so.1 libdemo.so
Последние две строчки в сессии командной строки создают символьные ссылки для soname и компоновочного имени.
Программа ldconfig(8) решает две потенциальные проблемы, присущие разделяемым библиотекам:
• разделяемая библиотека может находиться в разных каталогах. Ее загрузка может значительно замедлиться, если динамическому компоновщику придется искать ее во всех этих местах;
• при установке новых и удалении старых версий библиотеки некоторые символьные ссылки на имена soname могут оказаться неактуальными.
Для решения этих проблем программа ldconfig выполняет следующие действия.
1. Она проходит по стандартному набору каталогов и создает или обновляет файл кэша, /etc/ld.so.cache, содержащий мажорные версии всех найденных библиотек (точнее, последние минорные версии каждой из них). Динамический компоновщик, в свою очередь, использует данный кэш во время выполнения программы для превращения имени библиотеки в путь. Чтобы построить кэш, программа ldconfig сначала выполняет поиск по каталогм, указанным в файле /etc/ld.so.conf, а затем переходит к /lib и /usr/lib. Файл /etc/ld.so.conf содержит список каталогов (это должны быть полные пути), разделенных символами перевода строки, пробелами, табуляцией, запятыми или двоеточиями. В некоторых дистрибутивах в этот список входит каталог /usr/local/lib (в противном случае его, возможно, придется добавить вручную).
Команда ldconfig — p выводит текущее содержимое файла /etc/ld.so.cache.
2. Она проверяет последнюю минорную версию (то есть версию с самым большим минорным номером) каждой мажорной версии библиотеки для поиска встроенного имени soname, и затем создает (или обновляет) относительные символьные ссылки для каждого именн soname в том же каталоге.
Для корректного выполнения этих действий программе ldconfig нужно, чтобы библиотеки соблюдали соглашения об именовании, описанные ранее (то есть реальное имя библиотеки должно включать мажорный и минорный идентификаторы, которые соответствующим образом инкрементируются от версии к версии).
По умолчанию программа ldconfig выполняет оба действия, описанных выше. Чтобы выборочно пропустить одно из них, можно воспользоваться параметрами командной строки: параметр — N предотвращает обновление кэша, а — X позволяет обойтись без создания символьных ссылок для имен soname. Существует также параметр — v (от англ. verbose — «подробно»), который заставляет команду ldconfig выводить подробности о ее работе.
Программа ldconfig должна запускаться при установке каждой новой или обновлении/удалении имеющейся библиотеки, а также в случае изменения списка каталогов в файле /etc/ld.so.conf.
В качестве примера работы программы ldconfig рассмотрим ситуацию, когда нужно установить две разные мажорные версии библиотеки. Для этого можно сделать следующее:
$ su
Password:
# mv libdemo.so.1.0.1 libdemo.so.2.0.0 /usr/lib
# ldconfig — v | grep libdemo
libdemo.so.1 — > libdemo.so.1.0.1 (changed)
libdemo.so.2 — > libdemo.so.2.0.0 (changed)
Выше мы отфильтровали вывод ldconfig с целью получить только информацию, касающуюся библиотеки с именем libdemo.