Linux где лежат библиотеки

Обновлено: 04.07.2024

Copy raw contents

Copy raw contents

Все мы привыкли пользоваться программами в любой операционной системе для решения своих задач. Но за функциональностью программ стоит еще одна вещь, с которой мы редко встречаемся при обычной работе с компьютером. Это библиотеки, которые содержат общий набор функций и возможностей, используемых программами. Например, большинство программ, написанных на Си, используют стандартную библиотеку Си, в которой содержатся все основные возможности взаимодействия с системой.

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

ЧТО ТАКОЕ БИБЛИОТЕКИ?

Как я уже говорил выше - библиотеки реализуют общие возможности, которые потом используются программами. Если говорить просто, то библиотека - это набор функций, каждую из которых можно использовать в любой программе. Например, если программе нужно вывести строку на экран, она не будет лезть прямо в буфер видеокарты, а использует функцию из стандартной библиотеки.

Библиотеки делятся на два типа - динамические и статические. Статические библиотеки linux подключаются на этапе сборки программы, а динамические - во время выполнения и они общие для нескольких программ. Нас будут интересовать именно динамические библиотеки linux. Они находятся в папках /lib, /lib64, /usr/lib, /usr/lib/x86_64-linux-gnu. Каждая библиотека имеет расширение .so, за которым следует номер версии. Этот номер увеличивается каждый раз, когда разработчики вносят серьезные изменения. Такой подход необходим для того, чтобы сохранить совместимость для программ, использующих старые версии. Например, в системе может быть две библиотеки libfuse.so.0 и libfuse.so.1. Далее мы рассмотрим основные библиотеки и их предназначение.

КАК ПОЛУЧИТЬ ИНФОРМАЦИЮ О БИБЛИОТЕКАХ?

Перед тем как перейти к рассмотрению самих библиотек, вам, наверное, будет интересно, как получить информацию о них и узнать где они находятся в вашей системе. Библиотеки Linux могут быть размещены в различных каталогах, в зависимости от дистрибутива, но посмотреть эти каталоги можно, выполнив:


Во всех перечисленных здесь каталогах находятся статические и динамически библиотеки Linux:

ls -l /lib/x86_64-linux-gnu/


Информацию о зависимостях каждой библиотеки вы можете посмотреть командой ldd:


А еще можно узнать какому пакету принадлежит библиотека в Ubuntu:

dpkg -S /lib/x86_64-linux-gnu/ld-2.24.so


Как видите, библиотека ld.so принадлежит пакету libc6, точнее она входит в набор инструментов Си. Более подробно, о том, как устанавливать новые библиотеки и решать проблемы с ними, описано в статье библиотеки Ubuntu .

Это библиотеки основных языков программирования, которые содержат базовую функциональность для взаимодействия с системой.

  • libanl.so - библиотека работы с DNS;
  • libc.a - основная статическая библиотека языка Си;
  • libdl.a - библиотека, отвечающая за загрузку других библиотек во время запуска программы;
  • libnsl.so - работа со службой NIS;
  • libstdc++.so - стандартная библиотека C++;
  • libutil.so - реализует основные часто используемые функции;
  • libelf.so - библиотека для работы с бинарными файлами ELF;
  • libevent.so - библиотека с реализацией механизма вызова функций после события;
  • libgnutls.so - библиотека с основными методами и возможностями, используемыми в стандартных утилитах Linux;
  • ld-linux.so - главная библиотека, она собрана в виде статической и не имеет зависимостей. Загружает другие библиотеки и исполняемые файлы. Вы можете вызвать эту библиотеку как программу и передать ей адрес исполняемого файла для запуска.

Эти библиотеки содержат наборы кодеков для воспроизведения различных медиа данных. Некоторые из них имеют несвободную лицензию или закрытый исходный код:

В данной статье мы посмотрим, что такое статические и динамические библиотеки. Местоположение библиотек по умолчанию. Определение используемых библиотек. Загрузка библиотек.

Библиотеки это набор функций, которые могут использоваться в различных программах. Библиотеки могут быть статические (библиотека привязывается к определенной программе или софт содержит данную библиотеку в своем теле.) и динамическими (библиотеки грузятся в оперативную память и используются). Плюсы первого варианта нет проблемы совместимости, т. к. софт уже в себе содержит библиотеку, библиотека всегда с собой. Но при этом программы становятся большие по размеры и т.к каждая может загружать свои библиотеки, а иногда и одинаковые. Второй вариант значительно лучше, сами программы по своему размеру меньше. Библиотека загружается один раз в оперативку. И следующая программа, которой необходимы такие же функции, берет и использует эти данные.

По умолчанию библиотеки в Linux находятся в двух папках. Это корневая папка /lib в ней находятся библиотеки, которые используют программы, расположенные в корневой папке /bin.

И есть вторая папка /usr/lib . В ней находятся библиотеки, которые используют программы расположенные /usr/bin . Пути к библиотекам указаны файле /etc/ld.so.conf . Данный файл можно просмотреть стандартным способом, через утилиту cat.

Видим, что написано включить все библиотеки, которые расположены по пути, указанном в файле. Те которые оканчиваются на .conf . Он просто включает в себя все настройки, которые находятся в конфигурационных файлах, в данной директории. Переходим в данную директорию.

В данной директории мы можем видеть 2 файла конфигурации, в зависимости от версии и наполнения операционной системы их может быть и больше. Ну и соответственно в конфигурационных файлах находятся пути к директориям, где лежат необходимые для работы библиотеки. Если мы ставим какое, то свое программное обеспечение, которому необходимы дополнительные библиотеки, не идущие в составе дистрибутива linux, то в данной директории может создаться свой конфигурационный файл. Например: если мы используем систему виртуализации VMware , то к каждой VM устанавливаем VMware tools то данное программное обеспечение создаст свой конфигурационный файл с путями для своих библиотек.

Переходим в директорию cd /etc/ и отсортируем так, чтобы в результатах все, что содержит ld.

Видим 3 основных конфигурационных файла. ld.so.conf - это файл конфигурации в котором написано откуда брать дополнительные библиотеки. Директория ls.so.conf.d в которой находятся дополнительные конфигурационные файлы и ld.so.cache это кэш библиотек. Он у нас выстраивается каждый раз для того, чтобы программы при необходимости при запросе библиотек не копались в файлах, а сразу брали из загруженного в оперативную память кэша. Т.е. если мы вносим какие-то изменения в файл конфигурации, добавляем какие-то конфигурационные файлы нам необходимо обновить этот кэш. Кэш обновляется командой ldconfig . Этого, собственно, достаточно, чтобы прогрузить все библиотеки в кэш.

Давайте посмотрим, как, определить какими библиотеками пользуется какая программа.

Для этого мы будем использовать команду ldd и путь к бинарному файлу. Например: Программа ls которая используется для вывода списка файлов в каталоге. Она находится в каталоге /bin/ls .

В результате получим мы следующее:

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

В программировании библиотека - это набор предварительно скомпилированных фрагментов кода, которые можно повторно использовать в программе. Библиотеки упрощают жизнь программистам, поскольку они предоставляют многократно используемые функции, процедуры, классы, структуры данных и т. Д. (Написанные другим программистом), которые они могут использовать в своих программах.

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

Примеры библиотек в Linux включают libc (стандартная библиотека C) или glibc (версия стандартной библиотеки C для GNU), libcurl (библиотека многопротокольной передачи файлов), libcrypt (библиотека, используемая для шифрования, хеширования и кодирования в C) и многие другие. .

Linux поддерживает два класса библиотек, а именно:

  • Статические библиотеки - статически привязываются к программе во время компиляции.
  • Динамические или разделяемые библиотеки - загружаются при запуске программы и загружаются в память, а привязка происходит во время выполнения.

Динамические или разделяемые библиотеки можно разделить на следующие категории:

  • Динамически подключаемые библиотеки - здесь программа связана с общей библиотекой, и ядро u200bu200bзагружает библиотеку (если ее нет в памяти) при выполнении.
  • Динамически загружаемые библиотеки - программа берет на себя полный контроль, вызывая функции с библиотекой.

Общие библиотеки именуются двумя способами: имя библиотеки (также известное как soname) и «имя файла» (абсолютный путь к файлу, в котором хранится код библиотеки).

Например, soname для libc - libc.so.6: где lib - префикс, c - описательное имя, то есть общий объект, а 6 - версия. И его имя файла: /lib64/libc.so.6. Обратите внимание, что soname на самом деле является символической ссылкой на имя файла.

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

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

Если вы заглянете в каталог /etc/ld.so.conf.d, вы увидите файлы .conf для некоторых распространенных пакетов (в данном случае ядра, mysql и postgresql):

Если вы посмотрите на mariadb-x86_64.conf, вы увидите абсолютный путь к библиотекам пакета.

Приведенный выше метод устанавливает постоянный путь к библиотеке. Чтобы установить его временно, используйте переменную среды LD_LIBRARY_PATH в командной строке. Если вы хотите сохранить изменения постоянными, добавьте эту строку в файл инициализации оболочки/etc/profile (global) или

/.profile (для конкретного пользователя).

Давайте теперь посмотрим, как работать с разделяемыми библиотеками. Чтобы получить список всех зависимостей разделяемых библиотек для двоичного файла, вы можете использовать утилиту ldd. Вывод ldd имеет следующий вид:

Эта команда показывает все зависимости разделяемых библиотек для команды ls.

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

По умолчанию ldconfig считывает содержимое /etc/ld.so.conf, создает соответствующие символические ссылки в каталогах динамических ссылок, а затем записывает кеш в /etc/ld.so.cache, который затем легко используется другими программами. .

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

После создания общей библиотеки ее необходимо установить. Вы можете переместить его в любой из стандартных каталогов, упомянутых выше, и запустить команду ldconfig.

В качестве альтернативы выполните следующую команду, чтобы создать символические ссылки от soname к имени файла:

Чтобы приступить к созданию собственных библиотек, ознакомьтесь с этим руководством в Linux Documentation Project (TLDP).

На этом пока все! В этой статье мы познакомили вас с библиотеками, объяснили общие библиотеки и способы управления ими в Linux. Если у вас есть какие-либо вопросы или дополнительные идеи, которыми вы можете поделиться, используйте форму комментариев ниже.

Путь поиска для заголовочных файлов и библиотек Linux

1.1 В какую папку устанавливаются библиотечные файлы .so и заголовочные файлы .h при установке glibc, как gcc может правильно найти соответствующие папки?

Когда мы устанавливаем –prefix = / path / при сборке gcc, gcc устанавливается в / path /. По умолчанию gcc будет искать библиотеки в / path / lib / и искать файлы заголовков в / path / include /.
Например, в обычных системах Linux и gcc, и glibc установлены в каталоге / usr /, поэтому исполняемый файл gcc находится в каталоге / usr / bin, а файл библиотеки glibc находится в / usr / lib В этом каталоге файл заголовка glibc находится в каталоге / usr / include.
Разумеется, указанное выше соотношение не является точным и может быть указано вручную при установке gcc и glibc. Вы можете использовать команду "gcc -print-search-dirs" для просмотра пути поиска библиотеки gcc:

1

Вы можете использовать следующие методы, чтобы изменить путь к библиотеке и файлу заголовка, который gcc ищет по умолчанию:

  • (1) Используйте «gcc -nostdlib -Lusrlibpath», чтобы изменить путь поиска библиотеки по умолчанию для gcc, и используйте «gcc -nostdinc -Iusrincpath», чтобы изменить путь поиска заголовка по умолчанию для gcc.
  • (2) Используйте «gcc -Wl, -sysroot =», чтобы изменить путь поиска библиотеки по умолчанию для gcc.
  • (3) Измените файл спецификации gcc, чтобы настроить любые параметры gcc.

Спецификации - это файлы конфигурации gcc. Этот метод модификации является самым мощным, но он также является самым сложным и рискованным, поскольку файл спецификации gcc неясен и труден для понимания. Пока я не буду изменять его, но сначала я расскажу о существовании этого метода.
Используйте команду "gcc -v", чтобы просмотреть путь к спецификациям gcc:

2

В некоторых установках gcc используются встроенные спецификации, но нет внешних файлов спецификаций:

3

Для встроенной спецификации вы можете использовать команду "gcc -dumpspecs" для просмотра содержимого конкретной спецификации:

4

Вы также можете использовать "gcc -specs =", чтобы указать файл спецификации gcc.

  • (4) Передается ли конфигурация gcc по умолчанию командой configure во время сборки?

Используйте команду "gcc -v" для просмотра значения конфигурации gcc. Параметры конфигурации описаны в файле gcc-4.1.0 \ gcc \ doc \ install.texi.

5

1.2 Каковы пути поиска библиотеки ссылок, когда программа связана?

При связывании конфигурация пути поиска библиотеки имеет следующие методы: (Для конкретного использования, пожалуйста, обратитесь к описанию в главе примера)

  • (1) Используйте «gcc -Llibpath -llibname», чтобы указать путь поиска библиотеки ссылок.
  • (2) Используйте переменную среды "LIBRARY_PATH", чтобы указать путь поиска библиотеки ссылок.
  • (3) Используйте «SEARCH_DIR» в сценарии подключения ld, чтобы указать путь поиска библиотеки ссылок.

1.3 Когда программа работает, каковы пути поиска в библиотеке динамических ссылок?

При связывании конфигурация пути поиска библиотеки имеет следующие методы: (Для конкретного использования, пожалуйста, обратитесь к описанию в главе примера)

  • (1) При компиляции используйте «gcc -Wl, -rpath», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения, и жестко запишите его в опцию «RPATH» файла ELF.
  • (2) Переменная среды «LD_RUN_PATH» используется для указания пути поиска библиотеки динамических ссылок во время компиляции, и она жестко задана в опции «RPATH» файла ELF.
  • (3) Используйте переменную среды "LD_LIBRARY_PATH", чтобы указать путь поиска библиотеки динамических ссылок во время выполнения.
  • (4) Используйте файл конфигурации "/etc/ld.so.conf", чтобы указать путь поиска библиотеки динамических ссылок во время выполнения.
  • (5) Используйте путь поиска по умолчанию "/ lib, / usr / lib" библиотеки динамических ссылок во время выполнения.

1.4. Каковы пути поиска заголовочных файлов при компиляции программы?

При компиляции конфигурация пути поиска файла заголовка имеет следующие методы: (Для конкретного использования, пожалуйста, обратитесь к описанию в главе примера)

  • (1) Используйте «gcc -I incpath», чтобы указать путь поиска файла заголовка во время компиляции.
  • (2) Используйте переменную окружения "C_INCLUDE_PATH", чтобы указать путь поиска файла заголовка во время компиляции.
  • (3) Использовать путь поиска заголовка gcc по умолчанию при компиляции.

Описание общих каталогов заголовочных файлов:

/ usr / src / linux / - это путь к исходному коду ядра, а / usr / src / linux / include содержит заголовочный файл ядра, который обычно используется при компиляции модуля.

Путь / usr / include - это в основном заголовочный файл glibc, который используется для компиляции файлов пользовательского режима. Однако / usr / include также содержит папки linux / и asm /, необходимые для заголовочных файлов ядра, но эти две папки в основном используются для совместимости, а / usr все еще используется для заголовочных файлов ядра. / SRC / Linux / включить.

1.5. При настройке кросс-компилятора, каковы конфигурации пути поиска?

При создании кросс-компилятора необходимо обратить внимание на конфигурацию четырех связанных путей: путь файла библиотеки, связанный во время компиляции, путь файла заголовка, используемого во время компиляции, путь двоичного инструмента, используемого во время компиляции, и имя динамического загрузчика, указанного во время компиляции путь.

  • (1) Путь к файлу библиотеки, связанному во время компиляции:

Если не указан, это должен быть путь по умолчанию, связанный с путем установки. Если вы хотите указать, вы можете использовать опцию «LIB_PATH» при компиляции ld в binutils:

6

  • (2) Путь к заголовочному файлу, используемому во время компиляции:
  • (3) Бинарный путь инструмента, используемый во время компиляции:

Путь двоичного инструмента по умолчанию можно просмотреть с помощью следующей команды:

7

Используя указанный двоичный инструмент, вы можете использовать опцию "gcc -B":

  • (4) Путь и имя динамического загрузчика, указанного во время компиляции:

Путь и имя динамического загрузчика, жестко запрограммированного в elf, указанного в файле спецификации gcc:

8

Создайте два .c файла:

2.1, путь поиска библиотеки при связывании

Скомпилируйте say.c в libsay.so, а затем скомпилируйте libsay.so при компиляции test.c, чтобы проверить путь поиска в библиотеке, когда gcc связан.

9

  • (1) Используйте «gcc -Llibpath -llibname», чтобы указать путь поиска библиотеки ссылок:

10

(2) Используйте переменную среды "LIBRARY_PATH", чтобы указать путь поиска библиотеки ссылок:

11

(3) Используйте «SEARCH_DIR» в сценарии подключения ld, чтобы указать путь поиска библиотеки ссылок:

Используйте команду "ld -verbose", чтобы просмотреть параметр SEARCH_DIR в скрипте ссылок gcc по умолчанию. Конечно, вы также можете использовать "ld -Txxx.lds", чтобы указать скрипт связи.

12

Скопируйте libsay.so в указанный путь SEARCH_DIR и свяжите тест:

13

2.2, место поиска библиотеки динамической загрузки во время выполнения

  • (1) Используйте «gcc -Wl, -rpath», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения, и жестко закодируйте в ELF-файл параметр «RPATH»:


Используйте файл readelf для просмотра жестко заданного пути поиска библиотеки времени выполнения в файле elf:

15

  • (2) Используйте переменную среды "LD_RUN_PATH", чтобы указать путь поиска библиотеки динамических ссылок во время компиляции, и жестко запишите ее в опцию "RPATH" файла ELF:

16

  • (3) Используйте переменную среды «LD_LIBRARY_PATH», чтобы указать путь поиска библиотеки динамических ссылок во время выполнения:

17

(4) Используйте файл конфигурации "/etc/ld.so.conf", чтобы указать путь поиска библиотеки динамических ссылок во время выполнения:

18

(5) Используйте путь поиска по умолчанию "/ lib, / usr / lib" библиотеки динамических ссылок во время выполнения:

19

Создайте файл .c и файл .h:

2.3 Каковы пути поиска заголовочных файлов при компиляции программы?

(1) Используйте «gcc -I incpath», чтобы указать путь поиска файла заголовка во время компиляции:

20

(2) Используйте переменную окружения "C_INCLUDE_PATH", чтобы указать путь поиска файла заголовка во время компиляции:

21

  • (3) Использовать путь поиска заголовка gcc по умолчанию при компиляции:

Метод настройки пути поиска файла заголовка Gcc по умолчанию не уточнен. Но вы можете использовать следующую команду для просмотра:

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