web-dev-qa-db-fra.com

Comment détecter les dépendances manquantes pour un exécutable?

En regardant https://askubuntu.com/a/207750/23678 comment l'auteur a-t-il su quelle dépendance il manquait? Existe-t-il un moyen générique de rechercher la liste des dépendances d’un exécutable et celles qui manquent?

UPDATE: Je viens de remarquer que j'ai remarqué que https://stackoverflow.com/a/9082947/14731 utilisé

readelf -l [exécutable]

Est-ce la meilleure approche?

2
Gili

Dans la question liée à AskUbuntu, l'auteur savait quelle dépendance était manquante car il essayait d'installer une application 32 bits sur une installation Ubuntu 64 bits et, pour le citer:

certaines bibliothèques 32 bits sont absentes dans Ubuntu 64 bits.

Il avait donc besoin de les installer.

Cependant, pour répondre à vos questions:

  • Comment détecter les dépendances manquantes pour un exécutable?
  • Existe-t-il un moyen générique de rechercher la liste des dépendances d’un exécutable et celles qui manquent?

Oui, il existe un moyen de détecter les dépendances manquantes ou d’en obtenir une liste.

Détecter les dépendances manquantes:

Le système de gestion de paquetsapt, utilisé dans les distributions Linux basées sur Debian, est un système astucieux dans lequel il détectera automatiquement si les paquetages actuellement installés ont des dépendances manquantes (même si vous les avez installés avec dpkg et non apt-get). Supposons que vous ayez installé un paquet, sans ses dépendances, puis la prochaine fois que vous exécuterez apt-get upgrade, vous obtiendrez une erreur similaire à celle-ci:

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

Indiquer que package1 dépend de package2, et que package2 (à savoir, la version la plus récente dans cet exemple) n'est pas installé. Habituellement, pour résoudre ce problème, vous exécutez la commande Sudo apt-get install -f, qui indique à apt-get d'essayer de récupérer et d'installer les packages manquants.

Recherchez la liste des dépendances d'un exécutable:

La suite apt, ainsi que dpkg, fournit un moyen astucieux de lister les dépendances d'un paquet.

  • Pour apt, la commande est la suivante:

    apt-cache depends <packagename>
    

    Cela vérifiera le paquet dans les référentiels et listera les dépendances, ainsi que les paquets "suggérés". Si vous voulez vraiment filtrer les dépendances seules, vous pouvez filtrer la sortie en procédant comme suit: apt-cache depends <packagename> | grep Depends. Voici un exemple de sortie:

    alaa @ aa-lu: ~ $ apt-cache dépend vlc 
     vlc 
     Dépend de: fonts-freefont-ttf 
     Dépend de: vlc-nox 
     | Dépend de: libavutil51 
     Dépend de: libxpm4 
     Dépend de: zlib1g 
     PreDepends: dpkg 
     Suggère: videolan-doc 
     Recommande: vlc-plugin-notify 
     Recommande: xdg-utils 
     Breaks: vlc-data 
     Breaks: vlc-nox 
     Remplace: vlc-data 
     Remplace: vlc-nox

    La production est réduite pour des raisons de brièveté.

  • Pour dpkg, la commande permettant de l'exécuter sur un fichier local est la suivante:

    dpkg -I file.deb | grep Depends
    

    dpkg -I file.deb renvoie de nombreuses informations sur ce fichier .deb. Nous le filtrons donc pour ne regarder que les dépendances.

Puisque apt n'est en réalité qu'un front-end pour dpkg , ces deux commandes font essentiellement la même chose, elles vont dans le fichier .deb de l'application pour le savoir. quelles dépendances il a besoin, sauf que apt-cache regarde dans les référentiels. Ces "dépendances" sont listées à l'intérieur du fichier .deb en tant que métadonnées. C'est pourquoi, même si vous avez téléchargé et installé manuellement une application ( est généralement un fichier .deb. Vous devez donc l'installer à l'aide de dpkg et non pas apt) à partir d'un site Web (par exemple, le navigateur Chrome de Google à partir du site Web de Google). ), apt continuera à découvrir l'existence de dépendances manquantes en analysant les packages installés.


Je ne suis pas très au courant de tous ces problèmes d'architecture d'ordinateur, mais dans le cas de Java dans cette question, il s'agit en réalité d'architecture 32 et 64 bits. Pour citer la réponse de stackoverflow:

Vous utilisez un système 64 bits sans environnement d'exécution 32 bits.

Cette bibliothèque spécifique, qui devait être installée, n'était pas incluse dans la partie "Dépend" du package d'installation, car il installait une application 32 bits sur un système 64 bits. Donc, un dépannage supplémentaire était nécessaire pour trouver le coupable, d'où l'utilisation de readelf et ldd. Cependant, celles-ci sont probablement plus spécifiques aux bibliothèques, et rappelez-vous que les "dépendances" ne sont pas toujours des "bibliothèques", mais pourraient être d'autres applications. Donc " Est-ce la meilleure approche? ", j'en doute; Je pense que ce n’est que mieux si un dépannage supplémentaire est nécessaire.

1
Alaa Ali