Как посмотреть библиотеку линукс

Просмотр информации о библиотеке Linux / исполняемой версии

В Windows EXE и DLL имеют информацию о версии, включая, по крайней мере, следующие поля:

  1. версия файла
  2. версия продукта
  3. внутреннее имя
  4. наименование товара
  5. авторское право

В Linux Library / Исполняемый файл:

  • Какие поля присутствуют?
  • Как просмотреть такую ​​информацию?
  • Какие инструменты / библиотеки читать?

Информация о версии явно не сохраняется в файле ELF . У вас есть название библиотеки, в soname которую входит основная версия. Полная версия обычно хранится как часть имени файла библиотеки.

Если у вас есть, скажем libtest.so , библиотека , то у вас обычно есть:

  • libtest.so.1.0.1 — сам файл библиотеки, содержащий полную версию
  • libtest.so.1 — Ссылка на libtest.so.1.0.1 , имеющая то же имя, что и soname
  • libtest.so — Симлинк, libtest.so.1 используемый для ссылки.

В файле библиотеки libtest.so.1.0.1 будет SONAME динамическая секция, которая будет называть эту библиотеку вызываемой libtest.so.1 . Когда вы связываете программу с этой библиотекой, связанная программа будет хранить входящую soname библиотеку NEEDED в динамическом разделе.

Если вы хотите проверить, что именно находится в ELF-файле, вы можете попробовать запустить:

где elffile может быть библиотека исполняемого файла.

Если вы просто хотите получить версию библиотеки, вы можете поиграть с:

AFAIK, такой информации нет (по крайней мере, по умолчанию) в исполняемых файлах.

Или вы можете положиться на саму программу или свою систему упаковки, как писал Рахул Патил.

Источник

как проверить, установлена ​​ли библиотека?

В linux, как проверить, установлена ​​ли библиотека или нет? (из командной строки, конечно).

В моем конкретном случае сейчас я хочу проверить, установлен ли libjpeg.

7 ответов

Чтобы сделать это в независимом от дистрибутива * модуле, вы можете использовать ldconfig с grep, например:

Если libjpeg не установлен, выход не будет. Если он установлен, вы получите строку для каждой доступной версии.

Замените libjpeg любой библиотекой, которую вы хотите, и у вас есть общий, не зависящий от дистрибутива * способ проверки доступности библиотеки.

Если по какой-либо причине путь к ldconfig не задан, вы можете попытаться вызвать его, используя его полный путь, обычно /sbin /ldconfig .

Вы можете проверить с менеджером пакетов вашего дистрибутива (aptitude, yum, . ), но поскольку вы не предоставили свой дистрибутив, я не могу дать вам правильную команду.

Другим способом может быть запуск gcc -ljpeg , если вы получите ‘ld: library not found for -ljpeg’, это означает, что gcc не нашел библиотеку (но это не значит, что он не установлен), если вы получаете что-то вроде «Неопределенные символы:« _main », на которые ссылается: . » это означает, что libjpeg найден.

найдите libjpeg; ls /usr /lib /libjpeg *; ls /lib /libjpeg * — это еще один способ найти, установлена ​​ли lib в системе

Существует много других способов проверить, что если вы дадите нам больше контекста (почему вам нужно проверить, установлен ли libjpeg), мы могли бы предоставить вам лучшее решение для вашего конкретного случая.

Я использую утилиту whereis .
Пример:

$ whereis libjpeg
libjpeg: /usr/lib/libjpeg.so /usr/lib/libjpeg.a /usr/lib/libjpeg.la

Для распределения на основе deb вы можете сделать

Или, если вы знаете только имя файла, используйте

Имя файла обычно является libsomething.so [.version].

Я использую это:

Когда lib установлен, он дает:

Когда lib установлен не :

В системах на базе Redhat можно использовать pkg-config, чтобы проверить, установлена ​​ли библиотека или нет. Многие двоичные файлы rpm фактически выполняют те же проверки перед продолжением установки, поэтому мы можем разумно полагаться на его достоверность.

Читайте также:  Windows set proxy system

Это делается с помощью инструментов конфигурации на linux все время.

Другие трюки будут использовать команды типа ldconfig и dpkg .

Источник

Как показать все общие библиотеки, используемые исполняемыми файлами в Linux?

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

11 ответов

  1. использовать ldd список общих библиотек для каждого исполняемого файла.
  2. очистка на выходе
  3. Сортировать, вычислять количество, Сортировать по количеству

чтобы найти ответ для всех исполняемых файлов в каталоге «/ bin»:

изменить» / bin «выше на» / » для поиска всех каталогов.

вывод (только для каталога /bin) будет выглядеть примерно так:

У меня не было ldd на моей цепочке инструментов руки, поэтому я использовал objdump:

чтобы узнать, какие библиотеки использует двоичный файл, используйте ldd

вам придется написать небольшой сценарий оболочки, чтобы добраться до вашей общесистемной разбивки.

в Linux я использую:

это работает лучше, чем ldd когда исполняемый файл использует не по умолчанию погрузчик

Проверьте зависимости общей библиотеки исполняемого файла программы

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

> $ ldd / path/to / program

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

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

$ objdump-p /path/to/program | grep необходимо

на OS X по умолчанию нет ldd , objdump или lsof . В качестве альтернативы попробуйте otool -L :

в этом примере, используя which openssl заполняет полный путь для данного исполняемого файла и текущей пользовательской среды.

в системе UNIX предположим, что двоичное (исполняемое) имя-test. Затем мы используем следующую команду, чтобы перечислить библиотеки, используемые в тесте, —

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

(здесь sed удаляет все строки, которые не начинаются с вкладки, и отфильтровывает только фактические библиотеки. С sort | uniq -c вы получаете каждую библиотеку с количеством, указывающим количество раз, когда это произошло.)

вы, возможно, захотите, чтобы добавить sort -g в конце, чтобы получить библиотеки в порядке использование.

обратите внимание, что вы, вероятно, получите строки две строки без библиотеки с вышеуказанной командой. Один из статических исполняемых файлов («не динамический исполняемый файл») и один без библиотеки. Последнее является результатом linux-gate.so.1 который не является библиотекой в вашей файловой системе, а «поставляется» ядром.

readelf -d рекурсия

redelf -d производит подобный вывод objdump -p , который был упомянут в: https://stackoverflow.com/a/15520982/895245

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

выбрать один, и повторяю:

/maps для выполнения процессов

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

показывает все загруженные динамические зависимости init (PID 1 ):

этот метод также показывает библиотеку с dlopen , протестированы с это минимальный setup взломан sleep(1000) на Ubuntu 18.04.

на ubuntu печать пакетов, связанных с исполняемым файлом

лдд executable_name|у awk ‘<печати 3$>‘|команды xargs dpkg о -С |на awk -е «:» ‘<печати $1>‘

Я нашел этот пост очень полезным, так как мне нужно было исследовать зависимости от сторонней библиотеки (32 vs 64 бит пути выполнения).

Читайте также:  Как переместить панель пуск вниз windows 10

Я собрал Q&D рекурсивный скрипт bash на основе предложения «readelf-d» в дистрибутиве RHEL 6.

Это очень просто и будет проверять каждую зависимость каждый раз, даже если она могла быть протестирована раньше (i.e очень многословно). Выход тоже очень простой.

перенаправить вывод в файл и grep для «найдено» или «не удалось»

использовать и изменять, на свой страх и риск конечно, как вы пожелаете.

Источник

Библиотеки в Ubuntu

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

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

В этой статье мы подробно рассмотрим что такое библиотеки Ubuntu, как их устанавливать, где брать и что делать если библиотека установлена, а программа говорит что ее нет. Мы не будем трогать создание библиотек, это совсем не наша тема. Как обычно, начнем с теории.

Что такое библиотеки

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

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

Не нужно думать что библиотеки есть только в Linux, в Windows они тоже есть, только имеют другой формат и расширение dll. В Linux же все библиотеки находятся в папах /lib/, /usr/lib, /usr/local/lib или для 64 битных систем также появляется папка lib64 во всех этих подкаталогах, для библиотек специфичных для этой архитектуры. Библиотека имеет расширение .so и ее название начинается со слова lib. Например, libfuse.so, libc.so.

Дальше, после расширения файла .so идет номер версии библиотеки. Номер версии меняется всякий раз, когда разработчики вносят в нее изменения ломающие совместимость со всеми рассчитанными на нее программами. В таком случае в системе будут уже две библиотеки и каждая программа будет использовать правильную версию. Например, glibc.so.6 и glibc.so.5.

Если интересно можно даже посмотреть какие библиотеки и каких версий, использует та или иная программа, например:

linux-vdso.so.1 (0x00007ffd99167000)
libmount.so.1 => /usr/lib64/libmount.so.1 (0x00007f0f6beb0000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0f6bb08000)
libblkid.so.1 => /usr/lib64/libblkid.so.1 (0x00007f0f6b8c8000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f0f6b6a4000)
/lib64/ld-linux-x86-64.so.2 (0x000055aca8227000)
libuuid.so.1 => /usr/lib64/libuuid.so.1 (0x00007f0f6b49f000)
libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007f0f6b238000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0f6b034000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0f6ae17000)

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

Установка библиотек в Ubuntu

Обычно, если вы используете менеджер пакетов вашего дистрибутива для установки новых программ, то библиотеки устанавливаются автоматически. Но если вы хотите собрать программу из исходников или запустить 32 битную программу на 64 битной системе могут начаться проблемы. Например, при запуске или компиляции программы вы получаете ошибку:

error while loading shared libraries: xxxx.so.0
cannot open shared object file no such file or directory

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

Читайте также:  После обновления windows 10 лагает дота

apt search libfuse

Как видите, найдено два варианта библиотеки, libfuse2 и libfuse-dev.

Если библиотека нужна обычной программе и ее не нужно собирать из исходников, то будет достаточно установить библиотеку ubuntu без префикса dev. Например:

sudo apt install libfuse2

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

sudo apt install libfuse-dev

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

Посмотреть разрядность бинарника можно с помощью утилиты file:

На скриншоте показаны два варианта вывода программы, для 32 бит, в нашем случае Skype и для 64 — mount.

Для того чтобы установить библиотеку Ubuntu с архитектурой i386 сначала необходимо добавить поддержку архитектуры i386 в dpkg:

sudo dpkg —add-architecture i386

Затем обновляем наши репозитории:

sudo apt update

А во время установки нужной вам библиотеки теперь необходимо указать архитектуру через двоеточие после имени пакета:

sudo apt install libfuse-dev:i386

Если вы уверенны, что библиотека установлена, но программа все равно говорит, что такой библиотеки нет, то возможно, ей просто нужна другая версия библиотеки. Например, в системе есть libudev.so.0, а программе нужна libudev.so.0.1. Такое случается, если вы попытаетесь установить пакет для другого дистрибутива, особенно в Red Hat системах. Если в репозиториях нет нужной версии библиотеки, то скорее всего, они одинаковы, и можно просто создать символическую ссылку:

ln -s /lib/libudev.so.0 /lib/libudev.so.0.1

Затем программа найдет нужную библиотеку.

Управление библиотеками в Linux

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

Перед тем как библиотека будет подключена к программе, ее должна найти в системе специальная программа — менеджер библиотек. Он берет адреса библиотек из файла /etc/ld.cache, а этот файл формируется утилитой ldconfig, на основе файлов конфигурации /etc/ld.so.conf.

В этом файле перечислены все пути к библиотекам. Если вы хотите добавить свою папку для библиотек просто добавьте ее в этот файл:

Затем обновите кэш просто выполнив:

Теперь ваша библиотека может быть загружена программой, например, вы можете добавить путь /opt/lib или даже /home/user/lib. И система будет нормально грузить оттуда библиотеки.

Посмотреть какие библиотеки находятся в кеше ld.cache можно командой:

Также мы можем проверить находится ли там определенная библиотека:

ldconfig -p | grep libjpeg

Еще один способ указать программе где нужно искать библиотеки — это переменная LD_LIBRARY_PATH. Например:

Теперь программы, запускаемые в этом терминале, кроме стандартных путей поиска библиотек, будут использовать и указанную папку.

Выводы

Вот и все. Теперь вы знаете как работают библиотеки Ubuntu, как выполняется установка библиотек Ubuntu и делать так, чтобы программа видела нужную ей библиотеку. У новичков это может вызвать очень много головной боли, но теперь вы знаете что делать и избежите многих ошибок. Если у вас остались вопросы, пишите в комментариях!

Источник

Оцените статью