Fondamentalement, ce sont deux questions en une - parce que si je peux lister tous les symboles exportés dans un système, ainsi que leur chemin d'accès à la bibliothèque partagée, je pourrais simplement grep
cette sortie.
Pour les symboles du noyau, je suppose que c'est un peu plus facile - parce que nous pouvons toujours cat /proc/kallsyms
et obtenir une liste de tous les symboles de ces modules chargés en mémoire; puis sudo cat /proc/modules
donnera une liste des modules chargés avec leurs adresses, mais pas les chemins où ne modules ont été chargés à partir (si elles sont construites comme distinctes, hors arbre .ko objets)
Par exemple, j'essaie de tracer le programme en kst
utilisant ltrace
:
$ ltrace kst2
...
_ZNK13QGraphicsItem10parentItemEv(0xa1ccdb4, 0, 0xbfe631a8, 0x823652b, 0xbfe63298) = 0xa1ce854
__dynamic_cast(0xa1ce854, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce800
_ZNK13QGraphicsItem10parentItemEv(0xa1ccdb4, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce854
__dynamic_cast(0xa1ce854, 0x839ff00, 0x8306b80, 84, 0xbfe63298) = 0xa1ce800
...
... et j'aimerais savoir où cela _ZNK13QGraphicsItem10parentItemEv
réside.
Alors, que faire des symboles de bibliothèque partagée? Lecture de [gcc-help] Re: recherche de la bibliothèque dans laquelle le symbole est défini. ; J'ai essayé quelque chose comme ça:
$ find /usr/lib -name '*.so*' -exec nm --print-file-name --defined-only --dynamic {} \; | grep "QGraphicsItem"
...
/usr/lib/libQtGui.so.4.7.2:00766d70 T _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE
/usr/lib/libQtGui.so.4.7.2:00766aa0 T _Zls6QDebugN13QGraphicsItem18GraphicsItemChangeE
/usr/lib/libQtGui.so.4.7.2:00767e80 T _Zls6QDebugP13QGraphicsItem
...
... mais cela me pose des problèmes supplémentaires: je ne connais pas vraiment tous les chemins qui sont analysés pour les bibliothèques partagées sur mon système, donc quand j'ai essayé pour la première fois, find /lib ...
il n'a rien trouvé; Je trouve cela suppose des répertoires ennuyeuses, aussi bien que l'alternative: l' analyse du système de fichiers entier racine avec find
... Et, il me semble aussi frapper * .so ce qui ne peut être ouvert par nm
(? Peut - être parce qu'ils sont des liens symboliques), qui produire pas mal de messages d'erreur (que je n'aime pas non plus).
La chose est - ldd
(ou ld
?) Effectue probablement une partie de cette recherche de symboles, mais j'ai essayé les pages de manuel respectives, et je ne vois pas de moyen de "trouver" un symbole à partir de la ligne de commande, sans fournir une sorte de fichier exécutable en tant que argument. Question secondaire - y aurait-il un moyen d'utiliser ces outils pour cela?
Donc, ce que je recherche, c'est un outil en ligne de commande, qui se comporterait comme (pseudocode):
$ ./findsymbol '_Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE'
symbol found in:
/usr/lib/libQtGui.so.4.7.2:00766d70 T _Zls6QDebugN13QGraphicsItem16GraphicsItemFlagE
...
... où je ne spécifie aucun répertoire à rechercher - mais qui gérerait également, par exemple LD_PRELOAD
ou LD_LIBRARY_PATH
; si je le fais:
$ LD_PRELOAD="/path/to/mylib.so" ./findsymbol '*mylib_print*'
... alors j'obtiendrais l' /path/to/mylib.so
endroit où le symbole donné a été défini (étant donné qu'un tel symbole n'existerait pas dans les bibliothèques standard) - et sortirait "introuvable" sinon. Et sinon, ./findsymbol --dumpall
pourrait produire une liste de tous les symboles disponibles et leurs emplacements vus à partir d'un environnement donné (par exemple un bash
shell spécifique ).
Existe-t-il un outil comme celui-ci pour Linux?
la source
scanelf
vous permet de spécifier des répertoires spécifiques dans lesquels rechercher et de prendre en charge la recherche récursive-r
afin que vous puissiez modifier ses chemins de recherche ou rechercher l'ensemble de votre système sans trop de problèmes. Par exemplescanelf -r -s SYMBOL /lib/* /usr/* /opt/*
, vous trouverez la plupart des endroits où les bibliothèques se cachent.Sur les systèmes GNU (lorsque vous utilisez l'éditeur de liens dynamique GNU libc), vous pouvez exécuter votre programme en tant que:
Pour trouver où les symboles se résolvent.
la source
J'ai rencontré cela plusieurs fois, essayant de porter du code d'un système Linux à un autre. Habituellement, je finis par grep'ing tous les répertoires standard. Je n'ai rien trouvé sur Google. Voici donc un petit script:
edt11x / findinsharedlibs
la source