Existe-t-il un moyen de déterminer quels packages ou bibliothèques doivent être chargés pour prendre en charge un exécutable?

11

Il y a un exécutable que je veux installer sur un ordinateur que je ne peux pas recompiler qui n'a pas été construit en tant que package, et je veux télécharger les bibliothèques dont il a besoin pour les exécuter.

Ci - dessous une partie de la sortie de l' exécution lddsur elle

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)

Existe-t-il un outil qui peut utiliser ces informations pour sélectionner les packages à télécharger ou mieux extraire uniquement les bibliothèques répertoriées et leurs dépendances, afin de minimiser l'utilisation du disque? Le système fonctionne sur une machine virtuelle sans tête et le programme sera affiché via VNC.

Bien que je soupçonne qu'un bureau graphique complet fournira la plupart des bibliothèques nécessaires, je veux télécharger uniquement les bibliothèques requises, leurs dépendances et juste assez de package X Windows pour le prendre en charge.

vfclists
la source
1
Quel OS? Les packages et leurs noms ainsi que le gestionnaire de packages changent entre les distributions (et cela suppose que vous utilisez une sorte de Linux).
terdon
C'est Debian et Ubuntu dans ce cas
vfclists
Dans ce cas, ma réponse devrait fonctionner pour vous.
terdon
En fait, je suis sur le point de le tester, tardivement. J'ai tout simplement oublié et j'ai juste posé une question similaire qui a fait que celle-ci
apparaisse

Réponses:

14

Vous n'avez pas dit quel système d'exploitation vous utilisez donc je vais supposer Linux et j'utiliserai Debian comme exemple. Pour autant que je sache, la réponse rapide à votre question est non. Cela pourrait cependant être une solution de contournement utile:

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

Cela analysera la lddsortie puis s'exécutera apt-cache(remplacez-la par l'équivalent pour votre système d'exploitation) pour rechercher dans les référentiels les packages dont le nom et la description contiennent la première partie du nom de la bibliothèque renvoyée par ldd.

Cela ne les trouvera pas tous et donnera trop de résultats pour certains (comme libc) mais cela pourrait être utile.


@FaheemMitha a souligné que cela apt-filepourrait être une meilleure façon. Par exemple:

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

Cela renverra une liste de noms de packages qui fournissent les bibliothèques liées.

terdon
la source
1
apt-file searchsur le fichier réel sur le côté droit de la flèche pourrait être plus efficace.
Faheem Mitha
@FaheemMitha très bon point, merci. Réponse modifiée.
terdon
Comment ajuster la commande pour tester l'existence de la bibliothèque sur le système afin de trouver celles qui doivent être téléchargées? Je pense que la question que j'ai posée récemment va plus dans ce sens. Je demande sa réouverture.
vfclists
@vfclists n'en vaut pas vraiment la peine, juste apt-get installtous et tous ceux qui sont déjà installés seront ignorés.
terdon
La raison est de créer une VM sans bibliothèques superflues pour des téléchargements rapides. Les installations de packages contiennent de nombreux éléments inutiles et je n'ai besoin que des fichiers de bibliothèque et de leurs dépendances qui sont requis par les exécutables, ce qui me permet également de perfectionner mes compétences bash et Linux. Pas de python.
vfclists
3

La réponse de @ terdon est excellente mais il est encore plus facile de le faire en utilisant ce dpkg-queryqui contrairement à apt-fileest installé par défaut sur les systèmes Debian.

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

Cela produit une liste de packages.

jcoffland
la source
1

Votre meilleur pari est de trouver un package qui supporte réellement votre distribution. Mais si cela ne fonctionne pas pour vous, je ne connais qu'une autre façon.

Exécutez ldd comme vous l'avez fait, puis installez manuellement ces dépendances.

Par exemple libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)

Pour moi, cela signifierait installer apt-get install libpango:i386et prier pour que la version instable de Debian soit suffisamment bonne.

Vous auriez besoin de passer par chaque ligne de ldd, Google, de regarder dans vos référentiels disponibles et d'avoir de la chance. Installez-les ensuite un par un. Jusqu'à ce que le programme s'exécute réellement. ldd ne fonctionnera cependant que pour les programmes "simples". Les programmes qui appellent des plugins ou qui exécutent du code arbitraire sont une toute autre affaire. Pour ceux que vous devrez exécuter à partir de la console et corriger les plantages / erreurs à mesure qu'ils se produisent.

Cela dit, un exécutable binaire uniquement est horriblement difficile à maintenir. Vous voudrez peut-être envisager d'utiliser autre chose. Si votre distribution est un peu en avance ou un peu en arrière du système qui a construit cet exécutable, vous ne pourrez peut-être jamais le faire fonctionner.

coteyr
la source