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

Глядя на /questions/598863/net-takogo-fajla-ili-kataloga-pri-vyizove-java/598866#598866 как автор узнал, какая зависимость отсутствовала? Есть ли общий способ поиска списка зависимостей исполняемых файлов и какие из них отсутствуют?

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

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

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

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 зависит от vlc
    VLC
      Зависит от: fonts-freefont-ttf
      Зависит: vlc-nox
     | Зависит от: libavutil51
      Зависит от: libxpm4
      Зависит от: zlib1g
      PreDepends: dpkg
      Предлагает: videolan-doc
      Рекомендует: vlc-plugin-notify
      Рекомендует: xdg-utils
      Перерывы: vlc-data
      Перерывы: vlc-nox
      Заменяет: vlc-data
      Заменяет: 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, Однако они, вероятно, более специфичны для библиотек и помнят, что "зависимости" не всегда являются "библиотеками", но могут быть и другими приложениями. Так что "это лучший подход?", Я сомневаюсь в этом; Я думаю, что это лучше всего, когда требуется дополнительное устранение неполадок.

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