Как обнаружить отсутствующие зависимости для исполняемого файла?

Глядя на https://askubuntu.com/a/207750/23678 , как автор узнал, какая зависимость отсутствовала? Есть ли общий способ поиска списка зависимостей исполняемых файлов и какие из них отсутствуют?

ОБНОВЛЕНИЕ : Я только что заметил, что заметил, что https: // stackoverflow. com / a / 9082947/14731 используется

readelf -l [исполняемый файл]

Это лучший подход?

2
задан 23 May 2017 в 15:39

1 ответ

В связанном вопросе AskUbuntu автор знал, какая зависимость отсутствовала, потому что он пытался установить 32-битное приложение на 64-битную установку Ubuntu, и, процитировав его:

в 64-битной Ubuntu отсутствуют некоторые 32-битные библиотеки.

Поэтому ему нужно было их установить.

Тем не менее, чтобы ответить на ваши вопросы:

  • Как обнаружить отсутствующие зависимости для исполняемого файла?
  • Существует ли общий способ поиска списка зависимостей исполняемых файлов и какие из них отсутствуют?

Да, есть способ обнаружить отсутствующие зависимости или получить их список.

Обнаружение отсутствующих зависимостей:

Система управления пакетами apt, используемая в дистрибутивах Linux на основе Debian, представляет собой умную систему, в которой она автоматически обнаружит, установлены ли в данный момент установленные пакеты. отсутствующие зависимости (даже если вы установили их, используя dpkg, а не apt-get). Допустим, вы установили пакет без его зависимостей, и в следующий раз при выполнении apt-get upgrade вы получите ошибку, подобную этой:

The following packages have unmet dependencies:
 package1 : Depends: package2 (>= 1.8) but 1.7.5-1ubuntu1 is to be installed

Указывает, что package1 зависит от package2 и package2 (а именно, более новая версия в этом примере) не установлена. Обычно, чтобы исправить это, вы выполняете команду sudo apt-get install -f, которая инструктирует apt-get пытаться получить и установить отсутствующие пакеты.

Просмотрите список зависимостей исполняемого файла:

Пакет apt, как и dpkg, предоставляет удобный способ перечисления зависимостей пакета.

  • Для apt команда выглядит так:

    apt-cache depends <packagename>
    

    Эта команда проверит пакет в репозиториях и выведет список зависимостей, а также «предлагаемых» пакетов. Если вы действительно хотите отфильтровать зависимости в одиночку, вы можете отфильтровать вывод, выполнив следующее: apt-cache depends <packagename> | grep Depends. Вот пример выходных данных:

    alaa@aa-lu:~$ apt-cache depends vlc
    vlc
      Depends: fonts-freefont-ttf
      Depends: vlc-nox
     |Depends: libavutil51
      Depends: libxpm4
      Depends: zlib1g
      PreDepends: dpkg
      Suggests: videolan-doc
      Recommends: vlc-plugin-notify
      Recommends: xdg-utils
      Breaks: vlc-data
      Breaks: vlc-nox
      Replaces: vlc-data
      Replaces: vlc-nox

    Для краткости вывод сокращен.

  • Для dpkg команда для его запуска в локальном файле:

    dpkg -I file.deb | grep Depends
    

    dpkg -I file.deb возвращает много информации об этом файле .deb, поэтому мы фильтруем его смотреть только на зависимости.

Так как apt на самом деле просто интерфейс для dpkg , обе эти команды, по сути, делают одно и то же, они обращаются к файлу .deb приложения, чтобы найти какие зависимости ему нужны, кроме того, что apt-cache будет искать в репозиториях. Эти «зависимости» перечислены в внутри файла .deb как метаданные, поэтому даже если вы вручную загрузили и установили приложение (обычно это файл .deb, поэтому вы будете устанавливать используя dpkg, а не apt) с веб-сайта (например, браузер Google Chrome с веб-сайта Google), apt все равно узнает, что отсутствуют зависимости, анализируя установленные пакеты.


Я не очень хорошо разбираюсь в этой компьютерной архитектуре, но в случае с Java в этом вопросе речь идет о 32- и 64-битной архитектуре. Чтобы процитировать ответ от stackoverflow:

Вы работаете в 64-битной системе без 32-битной среды выполнения.

Эта конкретная библиотека, которую нужно было установить, не была включена в " Зависит «часть инсталляционного пакета, потому что он устанавливал 32-битное приложение в 64-битной системе. Таким образом, для поиска виновника потребовалось дополнительное устранение неполадок, отсюда и использование readelf и ldd. Однако они, вероятно, более специфичны для библиотек и помнят, что «зависимости» не всегда являются «библиотеками», но могут быть и другими приложениями. Поэтому « Это лучший подход? », я сомневаюсь в этом; Я думаю, что это лучше всего, когда требуется дополнительное устранение неполадок.

0
ответ дан 23 May 2017 в 15:39

Другие вопросы по тегам:

Похожие вопросы: