Я хотел бы знать, какие библиотеки используются исполняемыми файлами в моей системе. Более конкретно, я хотел бы определить, какие библиотеки используются чаще всего, наряду с двоичными файлами, которые их используют. Как я могу это сделать?
linux
shared-libraries
Алан Шлосек
источник
источник
dlopen
.Ответы:
ldd
для отображения общих библиотек для каждого исполняемого файла.Чтобы найти ответ для всех исполняемых файлов в каталоге "/ bin":
Измените "/ bin" выше на "/", чтобы найти все каталоги.
Вывод (только для каталога / bin) будет выглядеть примерно так:
Редактировать - убрал "grep -P"
источник
ldd -v
ldd
виду, что на самом деле исполняемый файл запускается со специальной переменной среды, и динамический компоновщик Linux распознает этот флаг и просто выводит библиотеки, а не запускает исполняемый файл. Посмотрите на источникldd
; в моей системе это скрипт bash. Если исполняемый файл статически связан и использует системные вызовы и указывает другой загрузчик, он может совершать произвольные злые действия. Так что не используйтеldd
на исполняемый файл, которому вы не доверяете.У меня не было ldd на моем ARM toolchain, поэтому я использовал objdump:
$ (CROSS_COMPILE) objdump -p
Например:
источник
ldd
которое не должно использоваться на ненадежных исполняемых файлах.obbjdump -p
показывает дополнительную информацию, такую какRPATH
, которая может быть полезна при исследовании проблем динамического связывания с вашим исполняемым файлом.musl-gcc
регулярно создаются двоичные файлы, так что вызовldd
двоичного файла просто выполняет двоичный файл , поэтому в настоящее время мне регулярно напоминают о том, насколько небезопасноldd
).В Linux я использую:
Это работает лучше, чем
ldd
когда исполняемый файл использует загрузчик не по умолчаниюисточник
чтобы узнать, какие библиотеки использует бинарный файл, используйте ldd
Вы должны написать небольшой сценарий оболочки, чтобы добраться до вашей общесистемной разбивки.
источник
Проверьте зависимости общей библиотеки исполняемого файла программы
Чтобы узнать, от каких библиотек зависит конкретный исполняемый файл, вы можете использовать команду ldd. Эта команда вызывает динамический компоновщик для определения библиотечных зависимостей исполняемого файла.
> $ ldd / path / to / program
Обратите внимание, что НЕ рекомендуется запускать ldd с любым ненадежным сторонним исполняемым файлом, потому что некоторые версии ldd могут напрямую вызывать исполняемый файл для определения его библиотечных зависимостей, что может представлять угрозу безопасности.
Вместо этого, более безопасный способ показать зависимости библиотеки неизвестного двоичного файла приложения - использовать следующую команду.
для получения дополнительной информации
источник
readelf -d
рекурсияredelf -d
производит аналогичный вывод,objdump -p
который был упомянут по адресу: https://stackoverflow.com/a/15520982/895245Но имейте в виду, что динамические библиотеки могут зависеть от других динамических библиотек, которые вам придется использовать.
Пример:
Образец выхода:
Затем:
Выберите один и повторите:
Образец вывода:
И так далее.
/proc/<pid>/maps
для запуска процессовЭто полезно, чтобы найти все библиотеки, которые в данный момент используются исполняемыми файлами. Например:
показывает все загруженные в данный момент динамические зависимости
init
(PID1
):Этот метод также показывает библиотеки, открытые с
dlopen
помощью этой минимальной установки, взломанной с помощьюsleep(1000)
Ubuntu 18.04.Смотрите также: /superuser/310199/see-currently-loaded-shared-objects-in-linux/1243089
источник
На OS X по умолчанию нет
ldd
,objdump
илиlsof
. В качестве альтернативы попробуйтеotool -L
:В этом примере использование
which openssl
заполняет полный путь для данной исполняемой и текущей пользовательской среды.источник
В системе UNIX предположим, что двоичное (исполняемое) имя - test. Затем мы используем следующую команду для просмотра списка библиотек, используемых в тесте:
источник
С помощью
ldd
вы можете получить библиотеки, которые используют инструменты. Чтобы оценить использование библиотек для набора инструментов, вы можете использовать что-то вроде следующей команды.(Здесь
sed
удаляются все строки, которые не начинаются с вкладки, и отфильтровываются только актуальные библиотеки. Сsort | uniq -c
каждой библиотекой вы получаете счетчик, показывающий, сколько раз это происходило.)Возможно, вы захотите добавить
sort -g
в конце, чтобы получить библиотеки в порядке использования.Обратите внимание, что вы, вероятно, получите строки две небиблиотечные строки с помощью вышеуказанной команды Один из статических исполняемых файлов («не динамический исполняемый файл») и один без какой-либо библиотеки. Последнее является результатом того,
linux-gate.so.1
что в вашей файловой системе есть не библиотека, а «поставляемая» ядром.источник
Еще один вариант можно просто прочитать файл, расположенный на
Например, если идентификатор процесса равен 2601, то команда
И вывод как
источник
в пакетах печати Ubuntu, связанных с исполняемым файлом
источник
Я нашел этот пост очень полезным, так как мне нужно было исследовать зависимости от сторонней библиотеки (32 или 64-битные пути выполнения).
Я собрал рекурсивный bash-скрипт Q & D, основанный на предложении 'readelf -d' для дистрибутива RHEL 6.
Он очень простой и будет проверять каждую зависимость каждый раз, даже если она была проверена ранее (то есть очень многословно). Выход тоже очень простой.
перенаправить вывод в файл и grep для «найдено» или «не удалось»
Используйте и изменяйте, на свой страх и риск, конечно, по своему желанию.
источник