Как узнать список библиотек, которые используются программой(бинарём)?Какие библиотеки использует программа?

Рейтинг: 0Ответов: 2Опубликовано: 11.01.2023

Есть собранный бинарь, надо узнать что он подтягивает(использует) для своей работы. Точно помню, что есть такая утилита на Linux, вот почему-то не могу найти.

Ответы

▲ 2Принят

Нашел в источнике:

  1. Если не знаем где лежит программа - ищем её

    find / -name firefox //(или любое другое имя вашей программы)
    
  2. переходим в директорию с бинарём и запускаем утилиту ldd

    ldd ./firefox
    
▲ 1

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

В хорошем случае зависимости даже динамические можно посмотреть через gdb genue debugger загружакшь прогу в отладчик и смотришь deps.

По нубский - тяп-ляп, ldd (list dynamic dependencies) даёт информацию о статический загруженных библиотеках.

Добавлено спустя. Вот пример догрузки на самом простейшем паскаль варианте под винду (добавлено просто для понимания как это вообще работает)

program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, Windows;
// Данная функция динамический зависима от user32.dll
// Если ОС не сможет загрузить её динамический, то приложение даже не запустится.
// Это всё видит `ldd` в линуксе
// Тут есть жесткое правило для ос - внешняя user32dll по имени MessageBeep
function MessageBeep(uType: UINT): BOOL; stdcall; external 'user32.dll' name 'MessageBeep';
// А вот в этом варианте она даже не существует но догрузится после
// Это уже увидит отладчик. После выполнения операций с загрузкой SO файла
// По факту пофигу, есть-ли user32 в системе или нет, но приложение уже запущенно.
// И уже приложение решает, что делать с ошибкой если вдруг динамический, динамическая библиотека не загруженна.
type TMyFunc = function(uType: UINT): BOOL; stdcall;
var
    hLib: DWORD;
    ptrProc: TMyFunc;
begin
    MessageBeep(0);

    hLib := LoadLibrary('user32.dll');
    ptrProc := GetProcAddress(hLib, 'MessageBeep');
    ptrProc(0);
end.