Понимание общих библиотек в Linux
В программировании библиотека — это набор предварительно скомпилированных фрагментов кода, которые можно повторно использовать в программе. Библиотеки упрощают жизнь программистам, поскольку они предоставляют повторно используемые функции, подпрограммы, классы, структуры данных и т. д. (написанные другим программистом), которые они могут использовать в своих программах.
Например, если вы создаете приложение, которое должно выполнять математические операции, вам не нужно создавать для этого новую математическую функцию, вы можете просто использовать существующие функции в библиотеках для этого языка программирования.
Примеры библиотек в Linux: libc (стандартная библиотека C) или Glibc (GNU-версия стандартной библиотеки C), libcurl (многопротокольный файл библиотека передачи), libcrypt (библиотека, используемая для шифрования, хеширования и кодирования в C) и многие другие.
Linux поддерживает два класса библиотек, а именно:
- Статические библиотеки – статически привязываются к программе во время компиляции.
- Динамические или общие библиотеки – загружаются при запуске программы и загружаются в память, а привязка происходит во время выполнения.
Динамические или общие библиотеки можно разделить на следующие категории:
- Динамически подключаемые библиотеки – здесь программа связывается с общей библиотекой, и ядро загружает библиотеку (если ее нет в памяти) при выполнении.
- Динамически загружаемые библиотеки – программа получает полный контроль, вызывая функции с помощью библиотеки.
Соглашения об именах общих библиотек
Общие библиотеки именуются двумя способами: по имени библиотеки (также известному как soname) и «имени файла» (абсолютный путь к файлу, в котором хранится код библиотеки).
Например, soname для libc — это libc.so.6: где lib — префикс, c — описательное имя, то есть означает общий объект, а 6 — версия. И имя его файла: /lib64/libc.so.6. Обратите внимание, что soname на самом деле является символической ссылкой на имя файла.
Поиск общих библиотек в Linux
Общие библиотеки загружаются с помощью ld.so (или ld.so.x) и ld-linux.so (или ld- linux.so.x), где x — версия. В Linux /lib/ld-linux.so.x ищет и загружает все общие библиотеки, используемые программой.
Программа может вызывать библиотеку, используя ее имя или имя файла, а путь к библиотеке хранит каталоги, в которых библиотеки можно найти в файловой системе. По умолчанию библиотеки расположены в каталогах /usr/local/lib, /usr/local/lib64, /usr/lib и . /usr/lib64; системные библиотеки запуска находятся в /lib и /lib64. Однако программисты могут устанавливать библиотеки в произвольные места.
Путь к библиотеке можно определить в файле /etc/ld.so.conf, который можно редактировать с помощью редактора командной строки.
vi /etc/ld.so.conf
Строки в этом файле предписывают ядру загрузить файл в /etc/ld.so.conf.d. Таким образом, сопровождающие пакетов или программисты могут добавлять свои собственные каталоги библиотек в список поиска.
Если вы заглянете в каталог /etc/ld.so.conf.d, вы увидите файлы .conf для некоторых распространенных пакетов (kernel, mysql и postgresql в Это дело):
ls /etc/ld.so.conf.d
kernel-2.6.32-358.18.1.el6.x86_64.conf kernel-2.6.32-696.1.1.el6.x86_64.conf mariadb-x86_64.conf
kernel-2.6.32-642.6.2.el6.x86_64.conf kernel-2.6.32-696.6.3.el6.x86_64.conf postgresql-pgdg-libs.conf
Если вы посмотрите mariadb-x86_64.conf, вы увидите абсолютный путь к библиотекам пакетов.
cat mariadb-x86_64.conf
/usr/lib64/mysql
Приведенный выше метод навсегда устанавливает путь к библиотеке. Чтобы установить его временно, используйте переменную среды LD_LIBRARY_PATH в командной строке. Если вы хотите сохранить изменения постоянными, добавьте эту строку в файл инициализации оболочки /etc/profile (глобальный) или ~/.profile (для конкретного пользователя).
export LD_LIBRARY_PATH=/path/to/library/file
Управление общими библиотеками в Linux
Давайте теперь посмотрим, как обращаться с разделяемыми библиотеками. Чтобы получить список всех зависимостей общей библиотеки для двоичного файла, вы можете использовать утилиту ldd. Вывод ldd имеет вид:
library name => filename (some hexadecimal value)
OR
filename (some hexadecimal value) #this is shown when library name can’t be read
Эта команда показывает все зависимости общей библиотеки для команды ls.
ldd /usr/bin/ls
OR
ldd /bin/ls
Пример вывода
linux-vdso.so.1 => (0x00007ffebf9c2000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000)
librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000)
libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000)
libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)
Поскольку общие библиотеки могут существовать во многих разных каталогах, поиск во всех этих каталогах при запуске программы будет крайне неэффективным: это один из вероятных недостатков динамических библиотек. Поэтому используется механизм кэширования, выполняемый программой ldconfig.
По умолчанию ldconfig считывает содержимое /etc/ld.so.conf, создает соответствующие символические ссылки в каталогах динамических ссылок, а затем записывает кеш в /etc/ld.so.cache, который затем легко используется другими программами.
Это очень важно, особенно если вы только что установили новые общие библиотеки, создали свои собственные или создали новые каталоги библиотек. Вам нужно запустить команду ldconfig, чтобы изменения вступили в силу.
ldconfig
OR
ldconfig -v #shows files and directories it works with
После создания общей библиотеки вам необходимо ее установить. Вы можете переместить его в любой из стандартных каталогов, упомянутых выше, и запустить команду ldconfig.
Альтернативно, выполните следующую команду, чтобы создать символические ссылки из soname на имя файла:
ldconfig -n /path/to/your/shared/libraries
Чтобы начать создавать собственные библиотеки, ознакомьтесь с этим руководством из The Linux Documentation Project (TLDP).
На данный момент это все! В этой статье мы познакомили вас с библиотеками и объяснили общие библиотеки и способы управления ими в Linux. Если у вас есть какие-либо вопросы или дополнительные идеи, которыми вы можете поделиться, воспользуйтесь формой комментариев ниже.