2010-05-05 4 views
5

Ich sehe, was ich denke, ist seltsames Verhalten von Objektdateien von den Microsoft Visual Studio 2003-Tools ausgegeben. Der file Dienstprogramm sagt mir:zerlegen Microsoft Visual Studio 2003-Compiler-Ausgabe

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

Für Objekte vom Assembler erstellt, sondern auch für Objekte aus C-Dateien kommen, bekomme ich nur:

cfile.obj: data 

Mit dumpbin Dienstprogramm Microsoft und den objdump ich von Cygwin bekam , Ich kann die Assembly-built-Datei zerlegen, aber ich bekomme keine nützlichen Ergebnisse von jedem Dienstprogramm für die C-built-Dateien.

Ich habe ein paar Fragen zu diesem Unterschied verbunden:

  1. Was das Objekt Dateiformat von der MSVC2003 Compiler erzeugt wird?
  2. Wie kann ich diese Objektdatei zerlegen?

Ich interessiere mich besonders für die Demontage in AT & T-Syntax in immer - ich bin ein Hafen einer großen Source-Basis zu tun, um es mit GCC funktioniert, und ich möchte diese Methode als Abkürzung verwenden für einige der Inline-Assembly-Routinen im Projekt.

Bearbeiten: Hinzufügen weiterer Informationen.

Als ich dumpbin auf eine dieser Dateien ausführen gibt mir keine Ergebnisse:

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 

Mit objdump, es gibt:

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

Auf den von der Montage gebaut Dateien, ich vernünftige Ergebnisse zu erzielen.

Nochmals bearbeiten: Hinzufügen von Befehlszeileninformationen.

Die Assembly-Dateien sind mit einer Befehlszeile ähnlich der folgenden gebaut:

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

ml wenn es selbst ausgeführt sagt:

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

Die C-Dateien mit dem folgenden Befehl erstellt werden:

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

Es gibt einige -I und -D Optionen an und an cl übergeben, aber ich habe sie der Kürze halber hier weggelassen. Die cl Optionen sind here beschrieben.

Antwort

4

bearbeiten, basierend auf den cl Befehlszeilenoptionen auf die Frage hinzugefügt werden:

denke ich, das Problem ist die Verwendung der /GL Option ist, die die Optimierung Link-Zeitcodegenerierung gibt getan wird.Von einer Dokumentseite für diese Option:

Obj-Dateien, die mit/GL erstellt wurden, sind für Linker-Hilfsprogramme wie EDITBIN und DUMPBIN nicht verfügbar.

Mit dieser Option bewirkt, dass der Compiler .obj Dateien zu erzeugen, die der Linker kann programmweite Optimierung auf ausführen - anscheinend das Dateiformat proprietär ist (vielleicht ist es irgendwo dokumentiert ist, aber ich vermute nicht).

Die Dokumente für /GL (auch bekannt als "gesamte Programmoptimierung", "Link-Time Code Generation" oder LTCG) enthalten mehrere Warnungen über die Interoperabilität der .obj Dateien oder Bibliotheken, die solche Objekte enthalten.


Ursprüngliche Antwort:

Was genau in der C-Quelle ist für die OBJ-Datei zu zerlegen Sie versuchen? Ich bekomme nach dem dumpbin /disasm test.obj für ein einfaches ‚Hallo Welt‘ Programm:

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 

Hinweis: Dies wird mit Hilfe einer .obj Datei zusammengestellt von und dumpbin von VS2005 zur Verfügung gestellt, aber ich kann dieses Zeug nicht vorstellen, hätte geändert viel von VS2003.

+0

@Michael: Sie haben recht - obwohl der tatsächlich generierte Code sich ändern könnte, haben sich die Tools wie Dumpbin nicht wesentlich geändert (ältere Versionen haben nicht alle aktuellen Befehlssätze gehandhabt, aber darum geht es). –

+0

Ich werde bearbeiten, um weitere Details hinzuzufügen. Die C-Quelle kann * alles * sein, soweit ich das beurteilen kann - jedes Objekt, das in diesem ganzen Projekt ausgegeben wird, hat das gleiche Verhalten. –

+0

Was sagt 'file' Ihnen den Typ der Objektdatei? –