2010-05-05 10 views
5

Vedo ciò che ritengo sia uno strano comportamento dei file oggetto generato dagli strumenti di Microsoft Visual Studio 2003. L'utilità file mi dice:Disassemblare l'output del compilatore Microsoft Visual Studio 2003

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

Per gli oggetti creati dal assembler, ma per gli oggetti provenienti da file C, ottengo solo:

cfile.obj: data 

Utilizzando dumpbin utility di Microsoft e la objdump ho ricevuto da cygwin , Posso disassemblare il file assemblato, ma non ottengo risultati utili da nessuna delle utility per i file creati da C.

Ho un paio di domande relative a questa differenza:

  1. Cosa viene generato il formato di file oggetto dal compilatore MSVC2003?
  2. Come posso smontare il file oggetto?

Sono particolarmente interessato a ottenere lo smontaggio in AT & sintassi T - Sto facendo un porto di una grande base di origine per farlo funzionare con GCC, e vorrei utilizzare questo metodo come scorciatoia per alcune delle routine di assemblaggio inline nel progetto.

Modifica: aggiungere ulteriori informazioni.

Quando eseguo dumpbin su uno di questi file mi dà alcun risultato:

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 

Con objdump, dà:

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

sui file costruite dal gruppo, ottengo risultati ragionevoli.

Modifica nuovamente: aggiunta di informazioni sulla riga di comando.

I file di montaggio sono costruiti con una riga di comando simile al seguente:

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

ml quando eseguito da solo dice:

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

I file C sono costruite con il seguente comando:

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

Ci sono alcuni -I e -D opzioni passate a ml e a cl, ma li ho omessi per brevità qui. Le opzioni cl sono descritte here.

risposta

4

Modifica in base alle cl opzioni della riga di comando che viene aggiunto alla domanda:

Credo che il problema è l'uso dell'opzione /GL, che specifica che l'ottimizzazione generazione di codice di collegamento in tempo sarà fatto.da una pagina doc su tale opzione:

I file OGG prodotti con/GL non saranno disponibili per tali utilità di collegamento come EDITBIN e DUMPBIN.

Utilizzando questa opzione fa sì che il compilatore di generare .obj file che il linker può eseguire l'ottimizzazione a livello di programma sul - a quanto pare il formato del file è proprietario (forse è documentato da qualche parte, ma io non sospetto).

la documentazione per /GL (noto anche come "l'ottimizzazione dell'intero programma", "generazione di codice link-tempo", o LTCG) contengono diversi avvertimenti circa l'interoperabilità dei file .obj o librerie che contengono file tali oggetti.


risposta originale:

Che cosa è esattamente la sorgente C per il file obj che si sta cercando di smontare? Ottengo il seguente utilizzando dumpbin /disasm test.obj per un semplice 'ciao mondo' del programma:

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 

Nota: questo sta usando un file .obj compilato da e dumpbin fornito da VS2005, ma non riesco a immaginare questa roba avrebbe cambiato molto da VS2003.

+0

@ Michael: hai ragione, anche se il codice generato potrebbe cambiare, gli strumenti come il dumpbin non sono cambiati in modo significativo (le versioni precedenti non gestivano tutti i set di istruzioni più recenti, ma questo è tutto). –

+0

Modificherò per aggiungere ulteriori dettagli. La fonte C può essere * qualsiasi cosa * per quanto posso dire - ogni output di oggetto in questo intero progetto ha lo stesso comportamento. –

+0

Che cosa significa 'file' indica il tipo di quel file oggetto? –