2010-05-05 7 views
5

Je vois ce que je pense être un comportement étrange des fichiers objets générés par les outils Microsoft Visual Studio 2003. L'utilitaire file me dit:Désassembler la sortie du compilateur Microsoft Visual Studio 2003

asmfile.obj: 80386 COFF executable not stripped - version 30821 

Pour les objets créés par l'assembleur, mais pour les objets provenant de fichiers C, je reçois juste:

cfile.obj: data 

Utilisation de l'utilitaire de Microsoft dumpbin et objdump je suis arrivé de Cygwin , Je peux démonter le fichier assemblé, mais je n'obtiens aucun résultat utile de l'un ou l'autre utilitaire pour les fichiers C-construits.

J'ai deux ou trois questions liées à cette différence:

  1. Quel est le format de fichier objet généré par le compilateur MSVC2003?
  2. Comment puis-je désassembler ce fichier objet?

Je suis particulièrement intéressé à obtenir le démontage AT & T syntaxe - Je fais un port d'une grande base source pour le faire fonctionner avec GCC, et je voudrais utiliser cette méthode comme un raccourci pour certaines des routines d'assemblage en ligne dans le projet.

Modifier: Ajout d'informations supplémentaires.

Quand je lance dumpbin sur un de ces fichiers me donne aucun résultat:

C:\> dumpbin /disasm Func.obj 
Microsoft (R) COFF/PE Dumper Version 7.10.6030  
Copyright (C) Microsoft Corporation. All rights reserved. 


Dump of file Func.obj 

FileType: ANONYMOUS OBJECT 

Avec objdump, il donne:

$ objdump -d Func.obj 
objdump: Func.obj: File truncated 

Sur les fichiers issus de l'assemblage, j'obtenir des résultats raisonnables.

Modifier à nouveau: Ajout d'informations sur la ligne de commande.

Les fichiers d'assemblage sont construits avec une ligne de commande qui ressemble à ce qui suit:

ml -nologo -W3 -WX -c -coff -FoAssemblyFile.obj -Zi -Cx AssemblyFile.asm 

ml lorsqu'il est exécuté par lui-même dit:

Microsoft (R) Macro Assembler Version 6.15.8803 
Copyright (C) Microsoft Corp 1981-2000. All rights reserved. 

Les fichiers C sont construits avec la commande suivante:

cl -nologo -W4 -WX -Gs32768 -GX -Gy -c -FdCFile.pdb -FoCFile.obj -Zi 
    -Gm -O1 -Oy- -Gy -GL -X CFile.c 

Il y en a quelques -I et -D options passées à ml et à cl, mais je les ai omis pour la brièveté ici. Les options cl sont décrites here.

Répondre

4

Modifier en fonction des options de ligne de commande cl étant ajoutée à la question:

Je pense que le problème est l'utilisation de l'option /GL, qui précise que l'optimisation de la génération de code lien temps se fera.à partir d'une page de document sur cette option:

Les fichiers obj générés avec/GL ne seront pas disponibles pour les utilitaires de liens tels que EDITBIN et DUMPBIN.

En utilisant cette option, le compilateur de générer .obj fichiers que l'éditeur de liens peut effectuer l'ensemble du programme d'optimisation sur - apparemment le format de fichier est propriétaire (peut-être qu'il est documenté quelque part, mais je soupçonne pas). Les docs pour /GL (également connu sous le nom «optimisation de programme complet», «génération de code de liaison» ou LTCG) contiennent plusieurs avertissements concernant l'interopérabilité des fichiers .obj ou des bibliothèques contenant de tels fichiers d'objets.


réponse originale:

Quelle est exactement la source de C pour le fichier obj que vous essayez de démonter? Je reçois le texte suivant à l'aide dumpbin /disasm test.obj pour un programme simple « bonjour monde »:

Microsoft (R) COFF/PE Dumper Version 8.00.50727.42 
Copyright (C) Microsoft Corporation. All rights reserved. 


Dump of file test.obj 

File Type: COFF OBJECT 

_main: 
    00000000: 55     push  ebp 
    00000001: 8B EC    mov   ebp,esp 
    00000003: 6A 01    push  1 
    00000005: 68 00 00 00 00  push  offset $SG4665 
    0000000A: E8 00 00 00 00  call  _printf 
    0000000F: 83 C4 08   add   esp,8 
    00000012: 33 C0    xor   eax,eax 
    00000014: 3B EC    cmp   ebp,esp 
    00000016: E8 00 00 00 00  call  __RTC_CheckEsp 
    0000001B: 5D     pop   ebp 
    0000001C: C3     ret 

    Summary 

     7AC .debug$S 
      30 .debug$T 
      2F .drectve 
      4 .rdata 
      4 .rtc$IMZ 
      4 .rtc$TMZ 
      1D .text 

Note: cela est d'utiliser un fichier .obj compilé par et dumpbin fourni par VS2005, mais je ne peux pas imaginer ce genre de choses aurait changé beaucoup de VS2003.

+0

@Michael: vous avez raison - bien que le code réel généré puisse changer, les outils comme dumpbin n'ont pas changé de manière significative (les anciennes versions ne traitaient pas tous les derniers jeux d'instructions, mais c'est à peu près tout). –

+0

Je vais modifier pour ajouter plus de détails. La source C peut être * n'importe quoi * autant que je sache: chaque objet produit dans ce projet entier a le même comportement. –

+0

Qu'est-ce que 'fichier' vous indique le type de ce fichier objet? –

Questions connexes