Команда ldconfig в linux

Обновлено: 04.07.2024

СИНТАКСИС
ldconfig [ПАРАМЕТРЫ. ]

ОПИСАНИЕ
ldconfig создает необходимые ссылки и кэш (для
использования диспетчером реального времени ld.so) для
наиболее часто используемых разделенных библиотек,
найденных в каталогах, указанных в командной строке, а
также указанных в файле /etc/ld.so.conf и в системных
каталогах (/usr/lib и /lib). ldconfig проверяет заголовки
и названия файлов в найденных библиотеках при определении
необходимости обновления ссылок в некоторых версиях.
ldconfig игнорирует символьные ссылки при поиске в
библиотеках.

ldconfig будет пытаться отслеживать связи, тип библиотек,
основанных на ELF (то есть libc 5.x или libc 6.x (glibc))
с другими библиотеками, хотя при создании динамических
библиотек правильнее явно организовывать связь с libc
(используя -lc). ldconfig может сохранять несколько
библиотек типа ABI в едином кэше на архитектурах, которые
позволяют одновременный запуск и работу нескольких ABI,
таких как ia32/ia64/x86_64 или sparc32/sparc64.

Некоторые существующие библиотеки не содержат достаточно
информации для определения их типа, хотя формат файла
/etc/ld.so.conf позволяет определить ожидаемый тип. Это
только те библиотеки ELF, с которыми мы не умеем работать.
Форматом для них будет строка типа "dirname=TYPE", где
type может быть libc4, libc5 или libc6. (Этот синтаксис
также работает из командной строки). Пробели не разрешены.
Также смотрите параметр -p.

Названия каталогов, содержащих = считаются
недействительными, пока не определен их тип.

ldconfig обычно должен запускаться супер-пользователем,
так как могут понадобиться права на запись в некоторые
каталоги и файлы, владельцем которых является root. Если
вы используете параметр -r для перехода в root-каталог,
вам не обязательны права супер пользователя, пока у вас
будут права на запись в этом дереве каталогов.

ПАРАМЕТРЫ
-v --verbose
Режим вывода подробной информации. Выводит номер
текущей версии, название каждого каталога при
сканировании и все созданные ссылки.

-n Обрабатывать только каталоги, указанные в командной
строке. Не обрабатывать ни системые каталоги
(/usr/lib и /lib), ни каталоги, указанные в
/etc/ld.so.conf. Включает использование параметра
-N.

-N Не пересобирать кэш. Пока не указано -X все связи
обновляются.

-X Не обновлять связи. Пока не указано -N кэш
пересобирается.

-f conf
Использовать conf вместо /etc/ld.so.conf.

-C cache
Использовать cache вместо /etc/ld.so.cache.

-r root
Стать root и перейти в каталог root.

-l Режим библиотек. Вручную связывать разные
библиотеки. Только для опытных профессионалов!

-p --print-cache
Печатает список каталогов и предположительных
библиотек, сохраненных сейчас в кэше.

-c --format=FORMAT
Использовать FORMAT для кэш-файла. Значениями могут
быть old, new и compat (по умолчанию).

-? --help --usage
Выдать информацию об использованиии программы.

-V --version
Выдать информацию о версии и закончить работу.

ПРИМЕРЫ
установит корректные связи для разделяемых бинарных файлов
и перемоберет кэш.
как root после установки новых разделяемых библиотек
корректно обновит их символьные ссылки в /lib.

ФАЙЛЫ
/lib/ld-linux.so.* загрузчик/привязчик времени исполнения
/etc/ld.so.conf файл, содержащий список каталогов,
разделенных двоеточиями, запятыми,
пробелами, символами табуляции, новой
строки, в которых надо искать
библиотеки.
/etc/ld.so.cache файл, содержащий упорядоченный список
библиотек, найденных в каталогах,
указанных в /etc/ld.so.conf. формат
этого файла плохо читаем и не
предназначается для редактирования
вручную.
lib*.so.version разделяемые библиотеки

НАЙДЕННЫЕ ОШИБКИ
ldconfig, будучи процессом пользователя, должно быть
запущено вручную и не имеет механизма динамического
определения и переназначения разделяемых библиотек,
используемых ld.so, при установке новых разделяемых
библиотек.

АВТОРЫ
Andreas Jaeger. Документация создана David Engel и Mitch
D'Souza.

Команда ldconfig предназначена для вызова одноименной утилиты, осуществляющей формирование кэша информации о новейших версиях разделяемых библиотек и создание символьных ссылок на них для последующей корректной работы динамического линковщика ld.so. Разделяемые библиотеки обычно содержат реализации функций, которые необходимы для корректной работы приложений или других разделяемых библиотек. Разделяемые библиотеки (*.so) являются полным аналогом динамических библиотек (*.dll) из Windows. Утилита использует файл конфигурации /etc/ld.so.conf для чтения списка нестандартных директорий с разделяемыми библиотеками (стандартными являются /usr/lib и /lib), а также получения дополнительной информации о некоторых библиотеках. Кроме того, она обрабатывает заголовочные файлы библиотек и их имена для создания символьных ссылок. Файл кэша динамического линковщика имеет имя /etc/ld.so.cache, следовательно, для его модификации требуются права суперпользователя. Единственным вариантом продуктивного использования утилиты без прав суперпользователя является вариант с указанием альтернативной директории с разделяемыми библиотеками для создания символьных ссылок без изменения системного кэша.

Базовый синтаксис команды выглядит следующим образом:

Утилита поддерживает параметр -v, позволяющий выводить дополнительную информацию об именах обрабатываемых директорий и именах создаваемых символьных ссылок, параметр -n, позволяющий обрабатывать лишь файлы разделяемых библиотек в указанных директориях, параметр -N позволяющий не обновлять системный кэш динамического линковщика, а ограничиться лишь созданием символьных ссылок, параметр -X, позволяющий не создавать символьных ссылок, а ограничиться лишь обновлением системного кэша динамического линковщика, параметр -f, позволяющий использовать указанный файл конфигурации утилиты вместо /etc/ld.so.conf, параметр -C, позволяющий использовать указанный файл системного кэша динамического линковщика вместо /etc/ld.so.cache, параметр -r, позволяющий изменить корневую директорию, параметр -p для отображения содержимого системного кэша динамического линковщика, а также параметр -c для указания формата системного кэша динамического линковщика (old, new, compat). В большинстве случаев вам не придется использовать данных параметров.

Примеры использования

Вывод содержимого системного кэша динамического линковщика

Для вывода содержимого системного кэша динамического линковщика, следует использовать параметр -p утилиты.

Как видно, системный кэш содержит информацию о 1330 библиотеках, причем в кэше имеется информация о полных путях к библиотекам, их архитектурах и используемых версиях стандартной библиотеки языка C (libc).

Обновление содержимого системного кэша динамического линковщика

Для обновления содержимого системного кэша динамического линковщика без создания символьных ссылок следует использовать параметр -X и иметь права суперпользователя. Также для наглядности можно воспользоваться параметром -v.

Утилита выведет список всех разделяемых библиотек, найденных в системе. Данная операция может исполняться при повреждении системного файла кэша динамического линковщика.

Обновление ссылок на разделяемые библиотеки

Для обновления ссылок на разделяемые библиотеки достаточно использовать параметр -N (для обработки всех системных директорий) или параметр -n (для указания конкретной директории).

В данном случае были созданы символьные ссылки для двух разделяемых библиотек.

В прошлый раз мы с Вами обнаружили, что запуск программ, скомпилированных вместе с динамическими библиотеками, вызывает ошибку:

Первая программа называется ldd. Она выдает на экран список динамических библиотек используемых в программе и их местоположение. В качестве параметра ей сообщается название обследуемой программы. Давайте попробуем использовать ее для нашей программы rezultdyn:

  • libc.so.6 - стандартную библиотеку функций языка C++.
  • ld-linux.so.2 - библиотеку динамической линковки программ ELF формата.
  • libfsdyn.so - нашу динамическую библиотеку функций.

Нашу библиотеку она найти не может. И правильно! Динамический линковщик ищет библиотеки только в известных ему каталогах, а каталог нашей программы ему явно не известен.

Для того, чтобы добавить нашу директорию с библиотекой в список известных директорий надо подредактировать файл /etc/ld.so.conf. Например, у меня этот файл состоит из таких строк:

Во всех этих директории хранятся всеми используемые библиотеки. В этом списке нет лишь одной директории - /lib, которая сама по себе не нуждается в описании, так как она является главной. Получается, что наша библиотека станет "заметной", если поместить ее в один их этих каталогов, либо отдельно описать в отдельном каталоге. Давайте для теста опишем, добавим строку в конец файла ld.so.conf:

У меня этот файл валяется в домашнем каталога пользователя root, у Вас он может быть в другом месте. Теперь после этого динамический линковщик будет знать где можно найти наш файл, но после изменения конфигурационного файла ld.so.conf необходимо, чтобы система перечитала настройки заново. Это делает программа ldconfig. Пробуем запустить нашу программу:

Как видите все заработало :) Если теперь Вы удалите добавленную нами строку и снова запустите ldconfig, то данные о расположении нашей библиотеки исчезнут и будет появляться таже самая ошибка.

Но описанный метод влияет на всю систему в целом и требует доступа администратора системы, т.е. root. А если Вы простой пользователь без сверх возможностей ?!

Для такого случая есть другое безболезненное решение. Это использование специальной переменной среды LD_LIBRARY_PATH, в которой перечисляются все каталоги содержащие пользовательские динамические библиотеки. Для того, чтобы установить эту переменную в командной среде bash надо набрать всего несколько команд. Для начала посмотрим есть ли у нас такая переменная среды:

У меня в ответ выводится пустая строка, означающая, что такой переменной среды нет. Устанавливается она следующим образом:

После этого программа rezultdyn будет прекрасно работать. В случае, если у Вас в системе эта переменная среды уже уставновлена, то, чтобы не испортить ее значение, надо новый каталог прибавить к старому значению. Делается это другой командой:

Если Вы обнулите эту переменную, то снова библиотека перестанет работать:

Вы также параллельно можете зайти в систему под другим пользователем или даже тем же самым, но если Вы захотите просмотреть значение LD_LIBRARY_PATH, то увидите ее прежнее значение. Это означает, что два разных пользователя Linux не могут влиять на работу друг друга, а это и есть самое главное хорошее отличие систем Unix от большинства других систем.

Каждый раз, когда в linux устанавливается новая библиотека, требуется команда ldconfig



После установки дополнительной библиотеки aruco opencv под opencv я обнаружил, что общий отчет компиляции не может найти файлы динамической библиотеки, потому что:
необходимо:

ldconfig - это команда управления динамически подключаемой библиотекой, цель которой состоит в том, чтобы сделать динамическую библиотеку общей для системы.

Основное назначение ldconfig:

По умолчанию он ищет / lilb и / usr / lib и файлы библиотеки в каталогах, перечисленных в файле конфигурации /etc/ld.so.conf.

Найдите разделяемую библиотеку динамических ссылок, формат файла библиотеки: lib ***. So. **, а затем создайте динамический загрузчик (ld.so) Требуется подключение и кеш файлов.

Файл кэша по умолчанию - /etc/ld.so.cache, в котором хранится отсортированный список имен библиотек динамических ссылок.

ldconfig обычно запускается при запуске системы,Когда пользователь устанавливает новую библиотеку динамических ссылок, вам нужно вручную запустить эту команду.

Описание параметра команды ldconfig:

1.-v или --verbose: с помощью этой опции ldconfig будет отображать сканируемый каталог и найденную библиотеку динамических ссылок, а также имя созданного соединения.

2.-n: при использовании этой опции ldconfig сканирует только каталог, указанный в командной строке, а не каталог по умолчанию (/ lib, / usr / lib) и каталоги, указанные в файле конфигурации /etc/ld.so.conf ,

3. -N: эта опция указывает ldconfig не перестраивать файл кэша (/etc/ld.so.cache). Если опция -X не используется, ldconfig обновляет подключение к файлу как обычно.

4. -X: эта опция указывает ldconfig не обновлять соединение с файлом. Если опция -N не используется, файл кэша обновляется нормально.

5.-f CONF: эта опция указывает, что файл конфигурации библиотеки динамических ссылок - CONF, и система по умолчанию имеет значение /etc/ld.so.conf.

6.-C CACHE: эта опция указывает, что сгенерированный файл кэша - CACHE. Системное значение по умолчанию - /etc/ld.so.cache. Этот файл хранит упорядоченный список общих библиотек динамических ссылок.

7. -r ROOT: этот параметр изменяет корневой каталог приложения на ROOT (реализуется путем вызова функции chroot). Если выбран этот параметр, системный файл конфигурации по умолчанию /etc/ld.so.conf, фактический соответствующий - ROOT / etc / ld.so.conf. Если используется -r / usr / zzz, при открытии файла конфигурации /etc/ld.so.conf файл /usr/zzz/etc/ld.so.conf фактически открывается. Эта опция может значительно увеличить гибкость управления динамической библиотекой.

8. -l: Обычно, когда ldconfig ищет библиотеку динамических ссылок, она автоматически устанавливает соединение с библиотекой динамических ссылок. Когда выбрана эта опция, она входит в режим эксперта и должна устанавливать соединение вручную. Обычные пользователи не используют эту опцию.

9, -p или --print-cache: эта опция указывает ldconfig распечатать имена всех общих библиотек, сохраненных в текущем файле кэша.

10.-c FORMAT или --format = FORMAT: эта опция используется для указания формата, используемого файлом кэша, существует три типа: ld (старый формат), новый (новый формат) и compat (совместимый формат, это формат по умолчанию).

11.-V: эта опция выводит информацию о версии ldconfig, а затем завершает работу.

12.- или --help или --usage: эти три параметра имеют одинаковый эффект, каждый из которых позволяет ldconfig распечатать справочную информацию и затем выйти.

Читайте также: