Найти библиотеки, с которыми был связан двоичный файл

Найти библиотеки, с которыми был связан двоичный файл

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

Что-то с ld или libtool?

Но я просто не могу вспомнить. Потратил некоторое время на гугл, но ничего полезного не нашел.

Обновлять
ldd <binary>помогло бы на linux, (от@Эрнелли) хотя я обнаружил, что это otool -L <binary>делает что-то похожее на MacOS X.

решение1

Попробуйте лдддвоичный-exec

Пример:

~$ ldd /bin/bash
    linux-gate.so.1 =>  (0x00606000)
    libncurses.so.5 => /lib/libncurses.so.5 (0x00943000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00c5d000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x003e9000)
    /lib/ld-linux.so.2 (0x00a41000)

решение2

Чтобы найти то, что ему непосредственно нужно:

readelf -d APP | grep NEEDED

lddкак упоминалось в другом месте, покажет все прямые и косвенные библиотеки - все, что нужно во время выполнения. Это может быть неполный список, так как вы можете динамически открывать вещи с помощью dlopen(), но это должно работать в 99% случаев.

ld и libtool используются во время компиляции/линковки. Они бесполезны, если у вас есть приложение.

РЕДАКТИРОВАТЬИз последующих ответов я вижу, что вы спрашивали об OSX, но я хочу добавить к своему ответу об инструментах Linux:

Я забыл упомянуть одну вещь, довольно давно; вы спрашивали о версиях. Ни то, ни lddдругое readelfне ответят на вопрос «какая версия». Они сообщат вам имя файла библиотеки, которую вы ищете, и соглашение об именовании может содержать некоторую информацию о версии, но ничто не навязывает это. Символы могут иметь версии, и вам придется много знать о еще более низком уровне, чтобы nmувидеть их,

решение3

Другой способ — использовать objdump.

objdump -x "двоичный" | grep НУЖЕН

Это показывает все необходимые зависимости только для этого двоичного файла. Очень полезно.

решение4

Theдругие ответыупускаем важный момент:

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

Только длянапрямую связан:

objdump --private-headers "${bin}" | grep 'НУЖНО' | cut --delimiter=' ' --fields=18-

Длявсе:

ldd "${bin}" | вырезать --fields=2 | вырезать --delimiter=' ' --fields=1 | rev | вырезать --delimiter='/' --fields=1 | rev | сортировать --unique --version-sort

Связанный контент