Есть ли способ определить, какие пакеты или библиотеки должны быть загружены для поддержки исполняемого файла?


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)

Существует ли инструмент, который может использовать эту информацию, чтобы выбрать, какие пакеты следует загрузить или, что еще лучше, извлекать только перечисленные библиотеки и их зависимости, чтобы минимизировать использование диска? Система работает на безголовой виртуальной машине, и программа будет отображаться через 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на самом файле справа от стрелки может быть более эффективным.
Фахим Митха

@FaheemMitha очень хорошая мысль, спасибо. Ответ отредактирован.
Terdon

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

@vfclists не стоит, на самом деле, apt-get installвсе они и все, что уже установлено, будут игнорироваться.
Terdon

Причина заключается в создании виртуальной машины без лишних библиотек для быстрой загрузки. Установочные пакеты содержат много ненужных элементов, и мне нужны только библиотечные файлы и их зависимости, которые требуются для исполняемых файлов. Это также дает мне возможность отточить свои навыки работы с bash и 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.