Подтвердить что ты не робот

Инструмент для зависимостей библиотек

Я ищу платформу tool/command на платформе Unix для обнаружения зависимостей library файлов .so и .o.

Я уже использовал ldd/nm/truss, но я не знаю правильного подхода к обнаружению зависимостей библиотек.

4b9b3361

Ответ 1

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

Команда ldd работает с общими библиотеками, а не только с исполняемыми файлами. Он отобразит зависимости общей библиотеки, объявленной при создании библиотеки:

$ ldd /usr/lib/libgtk-3.so
    linux-vdso.so.1 (0x00007ffff8fff000)
    libgdk-3.so.0 => /usr/lib/libgdk-3.so.0 (0x00007f43fcf47000)
    libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007f43fcd43000)
    libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0x00007f43fcb36000)
    libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f43fc7fc000)
...

Библиотека может иметь символы undefined, которые получают путем связывания с другими библиотеками, не объявленными как зависимости. Вы можете использовать objdump -T или nm -D, чтобы показать динамические символы - undefined символы (те которые должны поступать из других библиотек) будет отображаться как *UND*:

$ objdump -T /usr/lib/libgtk-3.so | head

/usr/lib/libgtk-3.so:     file format elf64-x86-64

DYNAMIC SYMBOL TABLE:
0000000000066e38 l    d  .init  0000000000000000              .init
0000000000000000      DF *UND*  0000000000000000              g_param_spec_object
0000000000000000      DF *UND*  0000000000000000              g_utf8_validate
0000000000000000      DF *UND*  0000000000000000              g_date_get_month
0000000000000000      DF *UND*  0000000000000000              g_bookmark_file_get_visited
0000000000000000      DF *UND*  0000000000000000              g_value_get_float

Из этих имен символов должно быть возможно вывести необъявленные библиотечные зависимости.

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

$ pkg-config --libs gtk+-3.0
-lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0