Поиск по сайту:

Понимание общих библиотек в 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. Если у вас есть какие-либо вопросы или дополнительные идеи, которыми вы можете поделиться, воспользуйтесь формой комментариев ниже.