Чи є спосіб визначити, які пакунки чи бібліотеки слід завантажувати для підтримки виконуваного файлу?


11

Існує виконуваний файл, який я хочу встановити на комп’ютер, який я не можу перекомпілювати, що не був побудований як пакет, і я хочу завантажити бібліотеки, необхідні для їх запуску.

Нижче наводиться частина результатів роботи lddна ньому

libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6f64000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6f43000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb6e9e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6cf4000)
/lib/ld-linux.so.2 (0xb786e000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6cd3000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb6b7c000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6b4f000)

Чи є інструмент, який може використовувати цю інформацію для вибору пакетів, які слід завантажити, а ще краще витягнути лише перелічені бібліотеки та їх залежності, щоб мінімізувати використання диска? Система працює на безголовому VM, і програма буде відображатися через VNC.

Хоча я підозрюю, що повноцінний графічний робочий стіл забезпечить більшість потрібних бібліотек, я хочу завантажити лише необхідні бібліотеки, їх залежності та достатньо пакету X Windows для його підтримки.


1
Яка ОС? Пакети та їх назви, а також менеджер пакунків змінюються між дистрибутивами (і це припускає, що ви використовуєте якийсь Linux).
terdon

У цьому випадку Debian і Ubuntu
vfclists

У такому випадку моя відповідь повинна працювати для вас.
terdon

Насправді я збираюся її перевірити, запізніло. Я просто забув про це і просто задав подібне запитання, яке спричинило показ цього, як найпопулярнішого питання, LOL
vfclists

Відповіді:


14

Ви ще не сказали, яку ОС використовуєте, тому я припускаю Linux і буду використовувати Debian як приклад. Швидка відповідь на ваше запитання - наскільки я не знаю. Це може бути корисним рішенням:

ldd your_prog | awk '{print $1}' | sed 's/\..*//' | 
  while read n; do echo "----- $n ----"; apt-cache search ^$n; done

Це дозволить проаналізувати lddвихідний результат, а потім запустити apt-cache(замінити його еквівалентом для вашої ОС) для пошуку в сховищах для пакетів, ім'я та опис яких містить першу частину імені бібліотеки, повернуту ldd.

Це не знайде всіх із них і дасть занадто багато результатів для деяких (як libc), але це може бути корисно.


@FaheemMitha зазначив, що це apt-fileможе бути кращим способом. Наприклад:

ldd /bin/bash | awk '/=>/{print $(NF-1)}'  | 
 while read n; do apt-file search $n; done |
  awk '{print $1}' | sed 's/://' | sort | uniq

Це поверне список імен пакетів, які надають пов'язані бібліотеки.


1
apt-file searchу фактичному файлі праворуч від стрілки може бути ефективніше.
Faheem Mitha

@FaheemMitha дуже вдалий момент, дякую. Відповідь відредаговано.
terdon

Як можна налаштувати команду, щоб перевірити наявність бібліотеки в системі, щоб знайти ті, які потрібно завантажити? Я думаю, що питання, яке я задав нещодавно, більше відповідає цьому напрямку. Я прошу його відновити.
vfclists

@vfclists насправді не варто, просто apt-get installвсі вони та будь-які вже встановлені будуть ігноровані.
terdon

Причиною є створення віртуального комп'ютера без зайвих бібліотек для швидкого завантаження. Встановлення пакунків містять багато непотрібних елементів, і мені потрібні лише бібліотечні файли та їх залежність, які вимагаються виконуваними файлами. Це також дає мені можливість відточити мою баш та навички Linux. Немає пітона.
vfclists

3

Відповідь @ terdon чудова, але ще простіше це зробити, використовуючи те, dpkg-queryщо на відміну від apt-fileвстановленого за замовчуванням у системах Debian.

ldd /bin/bash | awk '/=>/{print $(NF-1)}' | while read n; do dpkg-query -S $n; done | sed 's/^\([^:]\+\):.*$/\1/' | uniq

Це створює список пакетів.


1

Ваша найкраща ставка - знайти пакет, який фактично підтримує ваш розподіл. Але якщо це не допоможе тобі, я знаю лише один інший спосіб.

Запустіть ldd як у вас є, а потім встановіть ці залежності вручну.

Наприклад libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)

Для мене буде означати встановлення apt-get install libpango:i386і молитися про те, щоб версія в Debian була нестабільною була досить хорошою.

Вам потрібно буде пройти кожен рядок ldd, Google, зазирнути у наявні сховища та в основному пощастити. Потім встановіть їх по черзі. Поки програма фактично не працює. ldd працюватиме лише для "простих" програм. Програми, які викликають плагіни або виконують довільний код, - це різне питання разом. Для тих, хто вам знадобиться запустити з консолі та виправити збої / помилки, як вони трапляються.

Однак, бінарний виконуваний файл - дуже важко підтримувати. Можливо, ви захочете скористатися чимось іншим. Якщо ваш дистрибутив трохи попереду або трохи відстає від системи, яка побудувала цей виконуваний файл, ви, можливо, ніколи не змусите його працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.