Comment puis-je trouver les fonctions d'un objet partagé sont utilisés par un programme ou une autre bibliothèque?
Comment puis-je trouver les fonctions d'un objet partagé sont utilisés par un programme ou une autre bibliothèque?
Dans ce cas précis, je voudrais voir qui fonctionne dans /lib/libgcc1_s.donc.1 sont utilisés par une autre bibliothèque dynamique.
Depuis qu'ils sont liés de façon dynamique, objdump -d ne permet pas de résoudre l'appel de la fonction des adresses.
Est-il un moyen à court d'exécuter le programme dans un débogueur ou de re-lier statiquement?
Merci,
Luca
Edit:
nm et readelf ne le fera pas, je n'ai pas besoin de voir les symboles qui sont présents dans un objet partagé, mais qui sont effectivement utilisés dans un autre objet que des liens vers elle.
Vous devez vous connecter pour publier un commentaire.
nm ne fonctionnera que si la bibliothèque n'était pas dépouillé de ses symboles. Cependant,
nm -D
pourrais vous montrer quelques infos:Mais il y a un autre outil qui peut vous aider à: readelf
Et si vous consultez les pages de manuel en option -s:
Displays the entries in symbol table section of the file, if it has one.
EDIT:
Bien, les symboles qui ne sont pas mises en œuvre à l'intérieur de l'objet à inspecter avec nm apparaîtra avec un U drapeau en face d'elle, mais nm ne vais pas vous dire que la bibliothèque sur votre système met en œuvre ce symbole.
Donc ce que vous cherchez peut probablement être réalisée avec un mélange de ldd et nm. ldd dit que les bibliothèques votre demande est liée à, et nm indique les symboles qui ne sont pas définis (U drapeau) ou mis en œuvre localement (T drapeau).
Après la liste de tous les symboles non définis (avec nm) sur l'application cible, vous devez parcourir toutes les bibliothèques rapporté par ldd à la recherche de ces symboles (à l'aide nm à nouveau). Si vous trouvez le symbole et il est précédé par le T drapeau, vous l'avez trouvé.
En passant, j'ai juste écrit ce one-liner pour bash pour illustrer mon idée. Il analyse une application nommée gagner et essaie de trouver les bibliothèques qui mettent en œuvre tous les symboles signalé comme indéfini.
Ou, si votre terminal prend en charge les couleurs:
Je suis sûr que quelqu'un va trouver une amélioration de la performance.
Sorties:
readelf
aussi avec-W
(Allow output width to exceed 80 characters
).Avez-vous regardé ltrace? Il intercepte les appels à un partage de la bibliothèque de fonctions au moment de l'exécution et imprime des informations sur eux comme ils se produisent.
Puisque c'est une solution dynamique, il ne serait pas imprimer les informations de bibliothèque appel lancé dans le cadre de votre programme, qui n'est jamais exécutée. Mais ça peut être utile en fonction de vos besoins.
Je ne suis pas au courant, même
nm
est d'une utilité limitée pour ce qui vous arrive d'avoir l'intention. Aussi, le préchargement (de l'éditeur de liens GNU) pourrait invalider les hypothèses que vous faites après l'aide d'un outil qui prétend ne pourrait le faire. Voir la ld.ainsi, l'homme page.LD_PRELOAD
peut être utilisé par quiconque pour remplacer la résolution de symboles qu'il allait se produire dans des circonstances normales.Cependant, même sans un débogueur, vous pouvez utiliser
LD_DEBUG
pour voir quelle fonction est en fin de compte utilisé.Peut-être le
nm
outil peut vous aider car il affiche les symboles les noms contenus dans un fichier binaire.C'est aussi simple que ABC à utiliser:
Ceci peut être réalisé à l'aide d'une technique appelée analyse statique dans l'Ingénierie Inverse
Vous avez besoin d'un Désassembleur pour cela. Voir http://en.wikipedia.org/wiki/Disassembler
IDA PRO est un bon désassembleur sorcière répond à votre question.Il est capable de lire ELFE de format de fichier, mais il n'est malheureusement pas gratuit.