Je veux connaître la liste des bibliothèques dynamiques qu'un binaire charge lorsqu'il est exécuté (avec leurs chemins d'accès complets). J'utilise CentOS 6.0. Comment faire ça?
executable
libraries
dynamic-linking
Ciro Santilli 改造 中心 六四 事件
la source
la source
lld
sur darwin, semble-t-il, et je ne peux pas le trouver via homebrew.otool -L <path-to-binary>
ldd
. Voir la page de manuel .readelf -d $executable | grep 'NEEDED'
Peut être utilisé si vous ne pouvez pas exécuter l'exécutable, par exemple s'il a été compilé de manière croisée, ou si vous ne lui faites pas confiance:
Exemple:
Exemple de sortie:
Notez que les bibliothèques peuvent dépendre d'autres bibliothèques, vous devez donc maintenant rechercher les dépendances.
Une approche naïve qui fonctionne souvent est la suivante:
mais la méthode la plus précise consiste à comprendre le
ldd
chemin / cache de recherche. Je pense queldconfig
c'est la voie à suivre.Choisissez-en un et répétez:
Exemple de sortie:
Etc.
Voir également:
/proc/<pid>/maps
pour les processus en coursMentionné par Basile , il est utile de rechercher toutes les bibliothèques actuellement utilisées par les exécutables en cours d'exécution. Par exemple:
affiche toutes les dépendances dynamiques de
init
(PID1
) actuellement chargées :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 aussi: Comment voir les objets partagés actuellement chargés dans Linux? | Super utilisateur
la source
ldd et lsof montrent les bibliothèques chargées directement ou à un moment donné . Ils ne tiennent pas compte des bibliothèques chargées via
dlopen
(ou rejetés pardlclose
). Vous pouvez obtenir une meilleure image de ceci en utilisantstrace
, par exemple,(puisque
dlopen
finalement des appelsopen
- bien que vous puissiez bien sûr avoir un système utilisant des noms différents pour les ouvertures 64 bits ...).Exemple:
me montre ceci:
à partir duquel on pourrait utiliser les noms ".so" pour voir uniquement les objets partagés.
la source
strace -e trace=open,openat myprogram
/proc/<pid>/maps
affiche égalementdlopen
libs btw: unix.stackexchange.com/questions/120015/…, laltrace -S
sortie est encore plus froide car elle affiche à la fois les appels système et les appels de bibliothèque tels quedlopen
: unix.stackexchange.com/questions/226524/…lsof peut également vous montrer quelles bibliothèques sont utilisées pour un processus particulier.
c'est à dire
la source
Pour un processus de pid 1234, vous pouvez également lire le
/proc/1234/maps
pseudo-fichier (textuel) (read proc (5) ...) ou utiliser pmap (1)Cela donne l’ espace d’adresse virtuel de ce processus, d’où les fichiers (y compris les bibliothèques partagées, même celles contenant le fichier dlopen (3) ) qui sont mappés en mémoire.
(bien sûr, utilisez
ps aux
ou pgrep (1) pour trouver les processus exécutant un programme donné)la source
Pour une requête en masse:
créer un petit script (
useslib
) et le mettre dans le PATH (ou spécifier un chemin complet dans la commande ci-dessous)Utilisez-le dans une
find
commande, par exemple:(libgtk-x11-2.0 semble être la lib gtk2)
la source
C'est utilisation possible
pmap
.Par exemple, démarrez un processus:
$ watch date
Obtenez pid:
$ ps -ef | grep watch
Afficher la carte mémoire:
$ pmap <pid>
Show avec chemin complet:
$ pmap <pid> -p
la source