Linux, какие библиотеки использует программа
Обновлено: 24.11.2024
В этом HOWTO для программистов обсуждается, как создавать и использовать программные библиотеки в Linux с помощью набора инструментов GNU. ``Библиотека программ'' - это просто файл, содержащий скомпилированный код (и данные), который позже будет включен в программу; программные библиотеки позволяют сделать программы более модульными, быстрее перекомпилировать и проще обновлять. Библиотеки программ можно разделить на три типа: статические библиотеки, общие библиотеки и динамически загружаемые (DL) библиотеки.
В этом документе сначала обсуждаются статические библиотеки, которые устанавливаются в исполняемый файл программы до того, как программа может быть запущена. Затем обсуждаются совместно используемые библиотеки, которые загружаются при запуске программы и совместно используются другими программами. Наконец, в нем обсуждаются динамически загружаемые (DL) библиотеки, которые можно загружать и использовать в любое время во время работы программы. Библиотеки DL на самом деле не являются другим видом формата библиотек (как статические, так и общие библиотеки могут использоваться в качестве библиотек DL); вместо этого разница заключается в том, как программисты используют библиотеки DL. HOWTO завершается разделом с дополнительными примерами и разделом со ссылками на другие источники информации.
Большинство разработчиков, разрабатывающих библиотеки, должны создавать общие библиотеки, поскольку они позволяют пользователям обновлять свои библиотеки отдельно от приложений, использующих эти библиотеки. Динамически загружаемые (DL) библиотеки полезны, но для их использования требуется немного больше работы, а многим программам не нужна гибкость, которую они предлагают. И наоборот, статические библиотеки делают обновление библиотек гораздо более проблематичным, поэтому для общего использования их трудно рекомендовать. Тем не менее, каждый из них имеет свои преимущества, и преимущества каждого типа описаны в разделе, посвященном этому типу. Разработчикам, использующим C++ и динамически загружаемые (DL) библиотеки, также следует ознакомиться с ``C++ dlopen mini-HOWTO''.
Стоит отметить, что некоторые люди используют термин динамически подключаемые библиотеки (DLL) для обозначения совместно используемых библиотек, некоторые используют термин DLL для обозначения любой библиотеки, которая используется в качестве библиотеки DL, а некоторые используют термин DLL для обозначения библиотека, отвечающая любому условию. Независимо от того, какое значение вы выберете, этот HOWTO охватывает библиотеки DLL в Linux.
Если у вас есть несколько лет опыта работы с экосистемой Linux и вы хотите поделиться этим опытом с сообществом, ознакомьтесь с нашими Правилами участия.
1. Обзор
В Linux двоичные исполняемые файлы обычно загружают общие библиотеки во время выполнения. Иногда нам нужно иметь представление о том, какие библиотеки будут загружены при запуске программы.
В этом руководстве мы рассмотрим несколько способов составления списка всех общих библиотек, используемых программой.
2. Краткое введение в библиотеки
В программировании библиотека – это набор предварительно скомпилированных фрагментов кода. Библиотеку можно повторно использовать в разных программах.
В Linux библиотеки можно разделить на следующие категории:
- Статические библиотеки: статически привязываются к программе во время компиляции
- Общие библиотеки: загружаются при запуске программы и загружаются в память во время выполнения
Далее посмотрим, как составить список общих библиотек программы.
3. Использование команды ldd
Утилита ldd представляет собой сценарий оболочки. Он выводит общие библиотеки, необходимые программе. Синтаксис использования этой команды довольно прост:
Давайте посмотрим, какие общие библиотеки нужны для редактора Vim:
Команда ldd очень удобна для вывода списка общих библиотек программы.
Однако использовать его следует с осторожностью, так как утилита ldd может выполнить программу для получения списка общих библиотек. Мы никогда не должны запускать команду ldd для ненадежных исполняемых файлов.
4. Использование команд objdump и grep
Команда objdump является частью пакета GNU Binutils. Он отображает информацию из объектных файлов. Чтобы вывести список необходимых общих библиотек программы, мы объединяем его с grep:
Давайте перечислим общие библиотеки vim с помощью команды objdump:
Если мы сравним приведенный выше вывод с выводом команды ldd, мы увидим, что команда ldd перечисляет намного больше библиотек, чем objdump< /em> команда. Например, liblz4.so.1 и libgcrypt.so.20 есть в выходных данных команды ldd, но они не отображаются в выходных данных objdump.
Это связано с тем, что команда objdump выгружает то, что сама программа определяет как библиотеки. Однако утилита ldd показывает, какие библиотеки ld.so будут загружены. Он следует за графиком, чтобы мы могли видеть, что будет загружено этими библиотеками во время выполнения.
Поэтому, по сравнению с командой objdump, ldd дает гораздо лучшее представление о том, что должно быть доступно во время выполнения.
5. С помощью команды readelf
Как и objdump, команда readelf является частью GNU Binutils. Он отображает информацию об объектных файлах формата ELF, выполняя функцию, аналогичную objdump.
Давайте проверим общие библиотеки vim с помощью команды readelf, отфильтрованные с помощью grep:
Из приведенного выше вывода мы видим общие библиотеки vim.
6. Чтение /proc/
Если программа уже запущена, мы также можем получить список загруженных общих библиотек, прочитав файл /proc/
В этом файле каждая строка описывает область непрерывной виртуальной памяти в процессе или потоке. Если процесс загрузил общую библиотеку, она появится в этом файле.
Снова возьмем в качестве примера редактор Vim, чтобы загрузить общие библиотеки.
Мы можем получить PID запущенного процесса vim с помощью команды pgrep:
Файл /proc/179015/maps содержит:
В приведенном выше выводе мы видим, что загруженные общие библиотеки перечислены в последнем столбце.
Однако последний столбец содержит некоторые другие значения, которые нам не нужны. К тому же много дубликатов. Мы можем отфильтровать данные и удалить дубликаты с помощью однострочника awk, чтобы получить чистый список общих библиотек:
Давайте разберемся, как работает однострочник awk:
- $NF !~ /\.so/ — если последний столбец не содержит «.so», мы его игнорируем
- – если последний столбец содержит общую библиотеку, мы заменяем строку последним столбцом, который является именем файла библиотеки.
- Когда строка со значением foo впервые попадает в awk, awk создает ассоциативный элемент массива: a ["foo"] со значением по умолчанию: 0
- a[“foo”]++ возвращает исходное значение 0, а затем увеличивает его значение на 1, поэтому выражение возвращает < em>0, а затем a[“foo”]=1
- !a["foo"]++ станет !0, оценивается как true, таким образом, инициируется действие по умолчанию : напечатать текущую строку
- Когда строка с «foo» появится снова, элемент массива уже существует, a[«foo»]++ вернет 1 > и удерживайте 2
- !a["foo"]++ на этот раз станет !1, поэтому у нас есть false: ничего не делать. Таким образом, повторяющиеся строки печатаются только один раз.
7. Заключение
В этой статье мы обсудили различные способы составления списка общих библиотек программы.
Команда ldd — самый простой способ показать общие библиотеки программы. Команда readelf является лучшим выбором по сравнению с остальными, поскольку мы имеем дело с форматом «ELF» в Linux. Однако мы должны помнить, что никогда не должны использовать его для ненадежных исполняемых файлов.
Если у вас есть несколько лет опыта работы с экосистемой Linux и вы хотите поделиться этим опытом с сообществом, ознакомьтесь с нашими Правилами участия.
Программные библиотеки — это давний, простой и разумный способ повторного использования кода. В этой статье объясняется, как создавать библиотеки с нуля и делать их доступными для клиентов. Хотя два примера библиотек предназначены для Linux, действия по созданию, публикации и использованию этих библиотек применимы и к другим Unix-подобным системам.
Примеры библиотек написаны на C, что хорошо подходит для этой задачи. Ядро Linux написано в основном на C, а остальное на ассемблере. (То же самое относится и к двоюродным братьям Windows и Linux, таким как macOS.) Стандартные системные библиотеки для ввода/вывода, работы в сети, обработки строк, математики, безопасности, кодирования данных и т. д. также написаны в основном на C. Чтобы написать библиотеку на Поэтому C должен писать на родном языке Linux. Кроме того, C устанавливает отметку производительности среди языков высокого уровня.
Дополнительные ресурсы по Linux
Есть также два примера клиентов (один на C, другой на Python) для доступа к библиотекам. Неудивительно, что клиент C может получить доступ к библиотеке, написанной на C, но клиент Python показывает, что библиотека, написанная на C, может обслуживать клиентов из других языков.
Статические и динамические библиотеки
В системах Linux есть два типа библиотек:
- Статическая библиотека (также известная как библиотечный архив) запекается в статически скомпилированном клиенте (например, в C или Rust) на этапе компоновки процесса компиляции. По сути, каждый клиент получает собственную копию библиотеки. Существенный недостаток статической библиотеки проявляется, если библиотеку необходимо пересмотреть (например, исправить ошибку), так как каждый клиент библиотеки должен быть перелинкован со статической библиотекой.Динамическая библиотека, описанная ниже, лишена этого недостатка.
- Динамическая (также известная как общая) библиотека помечается на этапе компоновки статически скомпилированной клиентской программы, но в остальном клиентская программа и код библиотеки остаются неподключенными до времени выполнения — код библиотеки не запекается в клиенте. Во время выполнения системный динамический загрузчик подключает общую библиотеку к выполняющемуся клиенту, независимо от того, исходит ли клиент от статически скомпилированного языка, такого как C, или от динамически скомпилированного языка, такого как Python. В результате динамическая библиотека может быть обновлена без неудобств для клиентов. Наконец, несколько клиентов могут совместно использовать одну копию динамической библиотеки.
Как правило, динамические библиотеки предпочтительнее статических, хотя это связано с их сложностью и производительностью. Вот как создается и публикуется каждый тип библиотеки:
- Исходный код библиотеки скомпилирован в один или несколько объектных модулей, которые представляют собой двоичные файлы, которые можно включить в библиотеку и связать с исполняемыми клиентами.
- Объектные модули упакованы в один файл. Для статической библиотеки стандартное расширение .a означает «архив». Для динамической библиотеки расширение .so означает «общий объект». Два примера библиотек с одинаковыми функциями опубликованы в виде файлов libprimes.a (статический) и libshprimes.so (динамический). Префикс lib используется для обоих типов библиотек.
- Файл библиотеки копируется в стандартный каталог, чтобы клиентские программы могли без суеты обращаться к библиотеке. Типичное расположение библиотеки, статической или динамической, — это /usr/lib или /usr/local/lib; возможны другие места.
Подробные инструкции по созданию и публикации библиотек каждого типа будут опубликованы в ближайшее время. Однако сначала я представлю функции C в двух библиотеках.
Функции библиотеки примеров
Две библиотеки примеров созданы из одних и тех же пяти функций C, четыре из которых доступны клиентским программам. Пятая функция, которая является утилитой для одной из четырех других, показывает, как C поддерживает скрытие информации. Исходный код для каждой функции достаточно короткий, чтобы функции могли быть размещены в одном исходном файле, хотя можно использовать несколько исходных файлов (например, по одному на каждую из четырех опубликованных функций).
Функции библиотеки элементарны и по-разному работают с простыми числами. Все функции ожидают беззнаковые (т. е. неотрицательные) целые значения в качестве аргументов:
- Функция is_prime проверяет, является ли ее единственный аргумент простым числом.
- Функция are_coprimes проверяет, имеют ли два ее аргумента наибольший общий делитель (НОД) 1, определяющий взаимно простые числа.
- Функция prime_factors выводит список простых множителей своего аргумента.
- Функция Гольдбаха ожидает четное целое число, равное 4 или больше, и перечисляет любые два простых числа, сумма которых равна этому аргументу; суммирующих пар может быть несколько. Функция названа в честь математика 18-го века Кристиана Гольдбаха, чья гипотеза о том, что каждое четное целое число, большее двух, является суммой двух простых чисел, остается одной из старейших нерешенных проблем в теории чисел.
Вспомогательная функция gcd находится в файлах развернутой библиотеки, но эта функция недоступна за пределами содержащего ее файла; следовательно, клиент библиотеки не может напрямую вызвать функцию gcd. Более пристальный взгляд на функции C проясняет этот момент.
Подробнее о функциях C
Каждая функция в C имеет класс хранения, который определяет область действия функции. Для функций есть два варианта:
- Классом хранения по умолчанию для функций является extern , что дает глобальную область действия функции. Клиентская программа может вызывать любую внешнюю функцию из примеров библиотек. Вот определение функции are_coprimes с явным extern :
- Статический класс хранения ограничивает область действия функции файлом, в котором функция определена. В примерах библиотек служебная функция gcd является статической:
Только функции в файле primes.c могут вызывать gcd, и только функция are_coprimes делает это. Когда статические и динамические библиотеки созданы и опубликованы, другие программы могут вызывать внешние функции, такие как are_coprimes, но не статическую функцию gcd. Таким образом, статический класс хранения скрывает функцию gcd от клиентов библиотеки, ограничивая область действия этой функции другими библиотечными функциями.
Функциям, отличным от gcd в файле primes.c, не нужно указывать класс хранения, который по умолчанию будет extern . Однако в библиотеках принято указывать extern явным образом.
C различает определения функций и объявления, что важно для библиотек. Начнем с определений. C имеет только именованные функции, и каждая функция определяется с помощью:
- Уникальное имя. В программе не может быть двух функций с одинаковыми именами.
- Список аргументов, который может быть пустым. Аргументы типизированы.
- Либо тип возвращаемого значения (например, int для 32-разрядного целого числа со знаком), либо void, если значение не возвращается.
- Тело, заключенное в фигурные скобки. В надуманном примере тело может быть пустым.
Каждая функция в программе должна быть определена ровно один раз.
Вот полное определение библиотечной функции are_coprimes :
Функция возвращает логическое значение (0, если ложь, или 1, если истина), в зависимости от того, имеют ли два целых аргумента наибольший общий делитель, равный 1. Полезная функция gcd вычисляет наибольший общий делитель целых аргументов n1 и n2. .
Объявление функции, в отличие от определения, не имеет тела:
Объявление заканчивается точкой с запятой после списка аргументов; тело не заключено в фигурные скобки. Функция может быть объявлена в программе несколько раз.
Зачем вообще нужны декларации? В C вызываемая функция должна быть видна вызывающей стороне. Существуют различные способы обеспечить такую видимость, в зависимости от того, насколько привередлив компилятор. Один из верных способов — определить вызываемую функцию выше вызывающей, когда обе они находятся в одном файле:
Определение функции f можно было бы переместить ниже вызова функции g, если бы f было объявлено выше вызова:
Но что, если вызываемая функция находится в файле, отличном от вызывающего? Каким образом функции, определенные в одном файле, становятся видимыми в другом файле, учитывая, что каждая функция должна быть определена в программе ровно один раз?
Эта проблема затрагивает библиотеки, как статические, так и динамические. Например, функции в двух библиотеках простых чисел определены в исходном файле primes.c, бинарные копии которого есть в каждой библиотеке; но эти определенные функции должны быть видны клиенту библиотеки на языке C, который представляет собой отдельную программу с собственными исходными файлами.
Объявления функций могут обеспечить видимость файлов. Для примеров с простыми числами существует заголовочный файл с именем primes.h, в котором объявляются четыре функции, которые должны быть видны клиентам библиотек на языке C:
Эти объявления служат интерфейсом, указывая синтаксис вызова для каждой функции.
Подводя итог, можно сказать, что библиотечная функция определяется ровно один раз, но объявляется там, где это необходимо; любой клиент библиотеки в C нуждается в объявлении. Заголовочный файл должен содержать объявления функций, но не определения функций. Если файл заголовка содержит определения, файл может быть включен в программу на языке C несколько раз, что нарушит правило, согласно которому функция должна быть определена в программе на языке C только один раз.
Исходный код библиотеки
Ниже приведен исходный код двух библиотек. Этот код, заголовочный файл и два примера клиентов доступны на моем веб-сайте.
Функции библиотеки
Эти функции служат зерном для библиотечной мельницы. Две библиотеки основаны на одном и том же исходном коде, а заголовочный файл primes.h является интерфейсом C для обеих библиотек.
Создание библиотек
Этапы создания и публикации статических и динамических библиотек различаются несколькими деталями. Для статической библиотеки требуется всего три шага, а для динамической — еще два. Дополнительные шаги по созданию динамической библиотеки отражают дополнительную гибкость динамического подхода. Начнем со статической библиотеки.
Исходный файл библиотеки primes.c скомпилирован в объектный модуль. Вот команда со знаком процента в качестве системной подсказки (двойные знаки диеза представляют мои комментарии):
Это создает двоичный файл primes.o , объектный модуль. Флаг -c означает только компиляцию.
Следующий шаг — архивирование объектных модулей с помощью утилиты Linux ar:
Три флага -cvq являются сокращением от «создать», «подробно» и «быстро добавить» (на случай, если в архив необходимо добавить новые файлы). Напомним, префикс lib стандартный, а имя библиотеки произвольное. Конечно, имя файла для библиотеки должно быть уникальным, чтобы избежать конфликтов.
Архив готов к публикации:
Статическая библиотека теперь доступна для клиентов, примеры которых ожидаются. (Судо включено для обеспечения правильных прав доступа для копирования файла в /usr/local/lib .)
Для динамической библиотеки также требуется один или несколько объектных модулей для упаковки:
Добавленный флаг -fpic указывает компилятору генерировать позиционно-независимый код, который представляет собой двоичный модуль, который не нужно загружать в фиксированное место в памяти. Такая гибкость имеет решающее значение в системе из нескольких динамических библиотек. Результирующий объектный модуль немного больше, чем созданный для статической библиотеки.
Вот команда для создания единого файла библиотеки из модуля(ей) объекта:
Флаг -shared указывает, что библиотека является общей (динамической), а не статической.Флаг -Wl вводит список опций компилятора, первая из которых устанавливает soname динамической библиотеки, что является обязательным. Soname сначала указывает логическое имя библиотеки ( libshprimes.so ), а затем, после флага -o, имя физического файла библиотеки ( libshprimes.so.1 ). Цель состоит в том, чтобы сохранить логическое имя постоянным, позволяя физическому имени файла изменяться в новых версиях. В этом примере цифра 1 в конце имени физического файла libshprimes.so.1 представляет собой первую версию библиотеки. Логические и физические имена файлов могут совпадать, но рекомендуется использовать разные имена. Клиент обращается к библиотеке по ее логическому имени (в данном случае libshprimes.so ), как я вскоре поясню.
Следующий шаг — сделать общую библиотеку легкодоступной для клиентов, скопировав ее в соответствующий каталог; например, снова /usr/local/lib:
Теперь устанавливается символическая ссылка между логическим именем общей библиотеки ( libshprimes.so ) и ее полным физическим именем файла ( /usr/local/lib/libshprimes.so.1 ). Проще всего дать команду с /usr/local/lib в качестве рабочего каталога:
Логическое имя libshprimes.so не должно меняться, но цель символической ссылки ( libshrimes.so.1 ) может быть обновлена по мере необходимости для новых реализаций библиотек, которые исправляют ошибки, повышают производительность и т. д.
Последний шаг (предупредительный) — вызвать утилиту ldconfig, которая настраивает динамический загрузчик системы. Эта конфигурация гарантирует, что загрузчик найдет только что опубликованную библиотеку:
Теперь динамическая библиотека готова для клиентов, включая два следующих примера.
Клиент библиотеки C
Заголовочный файл math.h необходим, поскольку библиотечная функция prime_factors вызывает математическую функцию sqrt из стандартной библиотеки libm.so .
Для справки, вот исходный код программы тестирования:
Программа тестировщика
При компиляции tester.c в исполняемый файл сложной частью является порядок флагов ссылок. Напомним, что две библиотеки примеров начинаются с префикса lib, и каждая имеет обычное расширение: .a для статической библиотеки libprimes.a и .so для динамической библиотеки libshprimes.so. В спецификации ссылок префикс lib и расширение отпадают. Флаг ссылки начинается с -l (L в нижнем регистре), и команда компиляции может содержать много флагов ссылки. Вот полная команда компиляции для программы тестера на примере динамической библиотеки:
Первый флаг ссылки идентифицирует библиотеку libshprimes.so, а второй флаг ссылки идентифицирует стандартную математическую библиотеку libm.so .
Компоновщик ленив, что означает, что порядок флагов ссылки имеет значение. Например, изменение порядка спецификаций ссылок приводит к ошибке времени компиляции:
Сначала идет флаг, ссылающийся на libm.so, но никакая функция из этой библиотеки не вызывается явно в программе тестера; следовательно, компоновщик не ссылается на библиотеку math.so. Вызов библиотечной функции sqrt происходит только в функции prime_factors, которая теперь содержится в библиотеке libshprimes.so. Полученная ошибка при компиляции программы тестера:
Соответственно, порядок флагов ссылок должен уведомлять компоновщика о необходимости использования функции sqrt:
Компоновщик перехватывает вызов библиотечной функции sqrt в библиотеке libshprimes.so и, следовательно, делает соответствующую ссылку на математическую библиотеку libm.so . Существует более сложный вариант связывания, который поддерживает любой порядок ссылок-флагов; в этом случае, однако, проще всего правильно расположить флаги ссылок.
Вот некоторые результаты запуска клиента тестера:
Для функции Гольдбаха даже относительно небольшое четное значение (например, 18) может иметь несколько пар простых чисел, суммирующихся с ним (в данном случае 5+13 и 7+11). Такие множественные пары простых чисел являются одним из факторов, усложняющих попытку доказательства гипотезы Гольдбаха.
Завершение работы с клиентом Python
Python, в отличие от C, не является статически компилируемым языком, а это означает, что образец клиента Python должен обращаться к динамической, а не к статической версии библиотеки простых чисел. Для этого в Python есть различные модули (стандартные и сторонние), поддерживающие интерфейс внешних функций (FFI), который позволяет программе, написанной на одном языке, вызывать функции, написанные на другом. Python ctypes — это стандартный и относительно простой FFI, который позволяет коду Python вызывать функции C.
У любого FFI есть проблемы, потому что интерфейсные языки вряд ли будут иметь точно такие же типы данных. Например, библиотека простых чисел использует тип C unsigned int, которого нет в Python; ctypes FFI сопоставляет C unsigned int с Python int . Из четырех внешних функций C, опубликованных в библиотеке простых чисел, две лучше работают в Python с явной настройкой ctypes.
В C-функциях prime_factors и goldbach вместо типа возвращаемого значения используется void, но ctypes по умолчанию заменяет C-void на Python int . При вызове из кода Python две функции C затем возвращают случайное (следовательно, бессмысленное) целочисленное значение из стека. Однако ctypes можно настроить таким образом, чтобы вместо этого функции возвращали None (нулевой тип Python). Вот конфигурация функции prime_factors:
Аналогичный оператор обрабатывает функцию Гольдбаха.
Интерактивный сеанс ниже (в Python 3) показывает, что интерфейс между клиентом Python и библиотекой простых чисел прост:
Функции в библиотеке простых чисел используют только простой тип данных, unsigned int . Если бы эта библиотека C использовала сложные типы, такие как структуры, и если бы указатели на структуры передавались библиотечным функциям и возвращались из них, то FFI, более мощный, чем ctypes, мог бы быть лучше для гладкого интерфейса между Python и C. Тем не менее, пример ctypes показывает что клиент Python может использовать библиотеку, написанную на C. Действительно, популярная библиотека NumPy для научных вычислений написана на C, а затем представлена в высокоуровневом API Python.
Библиотека простых чисел и расширенная библиотека NumPy подчеркивают, что C остается языком общения среди языков программирования. Почти каждый язык может взаимодействовать с C, а через C — с любым другим языком, который взаимодействует с C. Python легко взаимодействует с C, и, в качестве другого примера, Java может сделать то же самое, когда Project Panama станет альтернативой Java Native Interface (JNI). ).
Вопрос: я хотел бы знать, какие общие библиотеки загружаются во время выполнения, когда я запускаю конкретный исполняемый файл. Есть ли способ определить зависимости совместно используемой библиотеки исполняемого файла программы или запущенного процесса в Linux?
Вы можете использовать следующие методы, чтобы определить, от каких общих библиотек зависит данный исполняемый файл программы (например, /path/to/program ) или данный запущенный процесс (например, PID 1149 ).
Проверка зависимостей общей библиотеки исполняемого файла программы
Чтобы узнать, от каких библиотек зависит конкретный исполняемый файл, вы можете использовать команду ldd. Эта команда вызывает динамический компоновщик для определения библиотечных зависимостей исполняемого файла.
Обратите внимание, что не рекомендуется запускать ldd с каким-либо ненадежным исполняемым файлом стороннего производителя, поскольку некоторые версии ldd могут напрямую вызывать исполняемый файл для определения его библиотечных зависимостей, что может представлять угрозу безопасности. р>
Вместо этого более безопасным способом отображения библиотечных зависимостей неизвестного двоичного файла приложения является использование следующей команды.
Проверка зависимостей общей библиотеки запущенного процесса
Если вы хотите узнать, какие общие библиотеки загружаются запущенным процессом, вы можете использовать команду pldd, которая показывает все общие объекты, загруженные в процесс во время выполнения.
Обратите внимание, что для запуска команды pldd вам необходимы привилегии root.
Кроме того, утилита командной строки под названием pmap , которая сообщает о карте памяти процесса, также может отображать общие библиотеки зависимостей запущенного процесса.
Поддержка Xmodulo
Этот веб-сайт стал возможен благодаря минимальной рекламе и вашему любезному пожертвованию через PayPal (кредитная карта) или биткойн ( 1M161JGAkz3oaHNvTiPFjNYkeABox8rb4g ).
Читайте также: