2010-11-24 23 views
0

Y at-il un moyen d'inspecter le fichier objet généré à partir du code ci-dessous (fichier1.o) pour la présence du compilateur introduit temporaire? Quels outils pouvons-nous utiliser pour obtenir ces informations à partir de fichiers objets?Pouvons-nous inspecter un fichier objet pour la présence de temporaires introduits par le compilateur C++?

//file1.cpp 
void func(const int& num){} 
int main(){ func(2); } 
+1

Y a-t-il une raison particulière de le faire? –

+0

Je suis avec @Etienne à ce sujet. Plutôt que de nous demander "Comment puis-je ?" demandez-nous "Comment puis-je atteindre ?", où X se réfère à l'objectif réel que vous cherchez actuellement (et de façon erronée) à atteindre en faisant . – sbi

+0

Les temporaires tels que les temporaires "int" dans '1 + Foo() + 2 + Bar() + 3' vont être très difficiles à détecter. Le compilateur utilisera simplement un registre pour l'accumulation, mais C++ formellement avait trois temporaires pendant l'évaluation. – MSalters

Répondre

3

La meilleure façon que je peux penser à faire est de charger un programme qui utilise le fichier objet et démonter la fonction dans le débogueur. Le code du programme que vous avez affiché fonctionnerait bien pour cela. Déconnectez simplement l'appel à func, puis affichez l'assembleur lorsque vous faites un seul pas dans la fonction.

Dans un programme plus complexe, vous pouvez généralement afficher le code assembleur pour une fonction donnée par son nom. Consultez la documentation de votre débogueur pour savoir comment procéder. Sous Windows (Visual Studio), vous pouvez ouvrir la fenêtre Disassembly et entrer le nom de la fonction pour afficher le code de l'assembleur.

Si vous avez la source, la plupart des compilateurs vous permettent de sortir l'assembleur, parfois mélangé avec le code source. Pour Visual C++, il s'agit de /Fa.

+1

Note: Si vous utilisez gdb, il peut directement ouvrir un fichier objet et désassembler ses fonctions. 'gdb fichier1.o',' (gdb) disas principal', '(gdb) disas func'. Mais les références à d'autres symboles sembleront étranges. – aschepler

0

Si vous êtes sur un système ELF et que vous avez des binutils GNU, vous pouvez appeler readelf, probablement avec le commutateur -s.

0

Si vous avez la source disponible, il est probablement plus facile de regarder le fichier assembleur généré par le compilateur (-save-temps pour gcc). Sinon, objdump est votre ami.

0

Vous pouvez utiliser clang -cc1 --ast-print-xml pour obtenir une représentation XML d'une unité de traduction. La présence de provisoires peut être facilement détectée à partir de l'AST.