🐧 Как использовать команду ldconfig в системах Linux

by itisgood

Что такое ldconfig?

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

При этом используется информация, предоставленная конфигурационным файлом /etc/ld.so.conf.

Команда ldconfig создает базу данных кэша всех библиотек на основе конфигурационного файла.

Этот кэш обычно хранится в файле /etc/ld.so.cache.

Вот синтаксис команды ldconfig:

# ldconfig [option]

В следующей таблице описаны полезные опции команды ldconfig:

ОПЦИЯ ОПИСАНИЕ
-v Вывести дополнительную информацию.
-n Использовать опцию командной строки для указания местоположения новых разделяемых библиотек. Пример: ldconfig -n /some/directory.
-f Указать другой файл конфигурации, а не файл по умолчанию (/etc/ld.so.conf).
-p Используется для вывода списка текущих библиотек, хранящихся в файле кэша.

Конфигурационный файл /etc/ld.so.conf

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

# cat /etc/ld.so.conf 
include ld.so.conf.d/*.conf

Строка include в этом файле указывает системе также использовать все файлы конфигурации в указанном каталоге.

В случае предыдущего примера это будут все файлы, которые заканчиваются на “.conf” в каталоге /etc/ld.so.conf.d.

Сам конфигурационный файл прост.

Он просто содержит каталог, в котором хранятся разделяемые библиотеки:

# more /etc/ld.so.conf.d/libiscsi-x86_64.conf /usr/lib64/iscsi
# ls /usr/lib64/iscsi
libiscsi.so.2 libiscsi.so.2.0.10900

Список кэшированных библиотек

Чтобы перечислить кэшированные библиотеки, вы можете использовать опцию -p команды ldconfig, как показано ниже:

# ldconfig -p | more
784 libs found in cache `/etc/ld.so.cache'
        p11-kit-trust.so (libc6,x86-64) => /lib64/p11-kit-trust.so
        libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
        libyaml-0.so.2 (libc6,x86-64) => /lib64/libyaml-0.so.2
        libyajl.so.2 (libc6,x86-64) => /lib64/libyajl.so.2
        libxtables.so.10 (libc6,x86-64) => /lib64/libxtables.so.10
        libxslt.so.1 (libc6,x86-64) => /lib64/libxslt.so.1
        libxshmfence.so.1 (libc6,x86-64) => /lib64/libxshmfence.so.1
        libxml2.so.2 (libc6,x86-64) => /lib64/libxml2.so.2
        libxmlrpc_util.so.3 (libc6,x86-64) => /lib64/libxmlrpc_util.so.3
        libxmlrpc_server_cgi.so.3 (libc6,x86-64) => /lib64/libxmlrpc_server_cgi.so.3
        libxmlrpc_server_abyss.so.3 (libc6,x86-64) => /lib64/libxmlrpc_server_abyss.so.3
....

Добавление новых библиотек с помощью ldconfig

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

После добавления новых библиотек необходимо создать конфигурационный файл в каталоге /etc/ld.so.conf.d, а затем выполнить команду ldconfig.

Все эти задачи следует выполнять от имени пользователя root:

# ls /usr/lib64/test
mylib.so.1
# cat /etc/ld.so.conf.d/libtest.conf /usr/lib64/test
# ldconfig

Если команда ldconfig выполнена успешно, вывода не будет.

Переменная LD_LIBRARY_PATH

Обычные пользователи не могут успешно выполнить команду ldconfig; однако, если обычный пользователь хочет использовать пользовательскую общую библиотеку, то он может загрузить этот файл в свой домашний каталог и использовать переменную LD_LIBRARY_PATH для указания местоположения файлов пользовательской библиотеки, как показано ниже:

$ ls /home/testuser/lib
mylib.so.1
$ LD_LIBRARY_PATH=/home/testuser/lib

При полезном выполнении последняя команда не должна давать никакого результата.

Чтобы сделать это изменение постоянным, поместите команду LD_LIBRARY_PATH=/home/testuser/lib в файл ~/.bashrc.

$ vi ~/.bashrc
LD_LIBRARY_PATH=/home/testuser/lib
export LD_LIBRARY_PATH

Команда ldd

С помощью команды ldd можно посмотреть, какие общие библиотеки использует определенная команда.

Вот синтаксис команды ldd:

# ldd [options] FILE

Например:

# ldd /bin/ls
        linux-vdso.so.1 =>  (0x00007ffee2b3f000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007ff5a6c22000)
        libcap.so.2 => /lib64/libcap.so.2 (0x00007ff5a6a1d000)
        libacl.so.1 => /lib64/libacl.so.1 (0x00007ff5a6814000)
        libc.so.6 => /lib64/libc.so.6 (0x00007ff5a6447000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007ff5a61e5000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007ff5a5fe1000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff5a6e49000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00007ff5a5ddc000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff5a5bc0000)

Цель использования команды ldd – устранение проблем с кодом, который вы пишете.

Эта команда сообщает вам не только о том, какие библиотеки вызываются, но и о том, из какого каталога вызывается каждая библиотека.

Это может быть очень полезно, если библиотека ведет себя не так, как вы ожидаете.

В следующей таблице описаны полезные опции для команды ldd:

Опция ОПИСАНИЕ
-v Вывести дополнительную информацию.
-u Отображение всех неиспользуемых прямых зависимостей.

см. также:

You may also like

Leave a Comment