Je voudrais savoir quelles bibliothèques sont utilisées par les exécutables sur mon système. Plus précisément, j'aimerais classer les bibliothèques les plus utilisées, ainsi que les binaires qui les utilisent. Comment puis-je faire ceci?
linux
shared-libraries
Alan Szlosek
la source
la source
dlopen
.Réponses:
ldd
de répertorier les bibliothèques partagées pour chaque exécutable.Pour trouver la réponse pour tous les exécutables dans le répertoire "/ bin":
Remplacez «/ bin» ci-dessus par «/» pour rechercher tous les répertoires.
La sortie (uniquement pour le répertoire / bin) ressemblera à ceci:
Édition - Suppression de "grep -P"
la source
ldd -v
ldd
fait exécute l'exécutable avec une variable d'environnement spéciale, et l'éditeur de liens dynamique Linux reconnaît cet indicateur et sort simplement les bibliothèques plutôt que d'exécuter l'exécutable. Regardez la source pourldd
; sur mon système, c'est un script bash. Si l'exécutable est lié statiquement et utilise des appels système et spécifie un chargeur différent, il peut faire des choses arbitraires. Ne l'utilisez donc pasldd
sur un exécutable auquel vous ne faites pas confiance.Je n'avais pas ldd sur ma chaîne d'outils ARM, j'ai donc utilisé objdump:
$ (CROSS_COMPILE) objdump -p
Par exemple:
la source
ldd
ce qui ne devrait pas être utilisé sur les exécutables non approuvés.obbjdump -p
des informations supplémentaires telles que leRPATH
, qui peuvent être utiles lors de l'examen des problèmes de liaison dynamique avec votre exécutable.musl-gcc
produit régulièrement des binaires tels que l'appelldd
au binaire exécute simplement le binaire , donc de nos jours je me rappelle régulièrement à quel point illdd
est dangereux ).Sous Linux j'utilise:
Cela fonctionne mieux que
ldd
lorsque l'exécutable utilise un chargeur non par défautla source
pour savoir quelles bibliothèques un binaire utilise, utilisez ldd
Vous devrez écrire un petit script shell pour arriver à votre panne à l'échelle du système.
la source
Vérifier les dépendances de bibliothèque partagée d'un exécutable de programme
Pour savoir de quelles bibliothèques un exécutable particulier dépend, vous pouvez utiliser la commande ldd. Cette commande appelle l'éditeur de liens dynamique pour découvrir les dépendances de bibliothèque d'un exécutable.
> $ ldd / chemin / vers / programme
Notez qu'il n'est PAS recommandé d'exécuter ldd avec un exécutable tiers non fiable car certaines versions de ldd peuvent appeler directement l'exécutable pour identifier ses dépendances de bibliothèque, ce qui peut constituer un risque pour la sécurité.
À la place, un moyen plus sûr d'afficher les dépendances de bibliothèque d'un binaire d'application inconnu consiste à utiliser la commande suivante.
pour plus d'informations
la source
readelf -d
récursivitéredelf -d
produit une sortie similaire àobjdump -p
celle mentionnée sur: https://stackoverflow.com/a/15520982/895245Mais sachez que les bibliothèques dynamiques peuvent dépendre d'autres bibliothèques dynamiques, vous devez donc recurse.
Exemple:
Exemple de sortie:
Ensuite:
Choisissez-en un et répétez:
Exemple de sortie:
Etc.
/proc/<pid>/maps
pour exécuter des processusCeci est utile pour trouver toutes les bibliothèques actuellement utilisées par les exécutables. Par exemple:
affiche toutes les dépendances dynamiques actuellement chargées de
init
(PID1
):Cette méthode montre également les bibliothèques ouvertes avec
dlopen
, testées avec cette configuration minimale piratée avec unsleep(1000)
sur Ubuntu 18.04.Voir également: /superuser/310199/see-currently-loaded-shared-objects-in-linux/1243089
la source
Sur OS X par défaut, il n'y a pas de
ldd
,objdump
oulsof
. Comme alternative, essayezotool -L
:Dans cet exemple, l'utilisation
which openssl
remplit le chemin d'accès complet pour l'environnement utilisateur exécutable et actuel donné.la source
Sur le système UNIX, supposons que le nom binaire (exécutable) soit test. Ensuite, nous utilisons la commande suivante pour répertorier les bibliothèques utilisées dans le test est
la source
Avec
ldd
vous pouvez obtenir les bibliothèques que les outils utilisent. Pour classer l'utilisation des bibliothèques pour un ensemble d'outils, vous pouvez utiliser quelque chose comme la commande suivante.(Ici
sed
supprime toutes les lignes qui ne commencent pas par un onglet et filtre uniquement les bibliothèques réelles. Avecsort | uniq -c
vous obtenez chaque bibliothèque avec un décompte indiquant le nombre de fois où elle s'est produite.)Vous voudrez peut-être ajouter
sort -g
à la fin pour obtenir les bibliothèques par ordre d'utilisation.Notez que vous obtenez probablement des lignes deux lignes non-bibliothèque avec la commande ci-dessus. Un des exécutables statiques ("pas un exécutable dynamique") et un sans aucune bibliothèque. Cette dernière est le résultat de
linux-gate.so.1
ce qui n'est pas une bibliothèque dans votre système de fichiers mais une bibliothèque "fournie" par le noyau.la source
Une autre option peut être simplement lire le fichier situé à
Par exemple, l'ID de processus est 2601, puis la commande est
Et la sortie est comme
la source
sur les paquets d'impression ubuntu liés à un exécutable
la source
J'ai trouvé ce message très utile car j'avais besoin d'étudier les dépendances d'une bibliothèque fournie par un tiers (chemin (s) d'exécution 32 vs 64 bits).
J'ai mis en place un script bash récursif Q&D basé sur la suggestion 'readelf -d' sur une distribution RHEL 6.
Il est très basique et testera chaque dépendance à chaque fois même s'il a pu être testé auparavant (c'est-à-dire très détaillé). La sortie est également très basique.
rediriger la sortie vers un fichier et grep pour «trouvé» ou «échoué»
Utilisez et modifiez, à vos risques et périls bien sûr, comme vous le souhaitez.
la source