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 grepcette sortie.
Pour les symboles du noyau, je suppose que c'est un peu plus facile - parce que nous pouvons toujours cat /proc/kallsymset obtenir une liste de tous les symboles de ces modules chargés en mémoire; puis sudo cat /proc/modulesdonnera 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 kstutilisant 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 _ZNK13QGraphicsItem10parentItemEvré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_PRELOADou LD_LIBRARY_PATH; si je le fais:
$ LD_PRELOAD="/path/to/mylib.so" ./findsymbol '*mylib_print*'
... alors j'obtiendrais l' /path/to/mylib.soendroit 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 --dumpallpourrait produire une liste de tous les symboles disponibles et leurs emplacements vus à partir d'un environnement donné (par exemple un bashshell spécifique ).
Existe-t-il un outil comme celui-ci pour Linux?