代码之家  ›  专栏  ›  技术社区  ›  Carl Norum

反汇编Microsoft Visual Studio 2003编译器输出

  •  5
  • Carl Norum  · 技术社区  · 15 年前

    我看到了我认为是来自MicrosoftVisualStudio2003工具输出的对象文件的奇怪行为。这个 file 实用程序告诉我:

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

    对于汇编程序创建的对象,但是对于来自C文件的对象,我只得到:

    cfile.obj: data
    

    使用微软的 dumpbin 效用与 objdump 我从cygwin获得的,我可以反汇编构建的文件,但是对于C构建的文件,这两个实用程序都没有得到有用的结果。

    我有几个与这种差异相关的问题:

    1. MSVC2003编译器生成的对象文件格式是什么?
    2. 我该如何反汇编那个对象文件?

    我对AT&T语法中的反汇编特别感兴趣-我正在做一个大型源代码库的端口,以使它与GCC一起工作,我想将此方法用作项目中某些内联汇编例程的快捷方式。

    编辑:添加更多信息。

    当我奔跑 垃圾桶 其中一个文件没有给出结果:

    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
    

    反汇编 它给出:

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

    在从程序集生成的文件上,我得到了合理的结果。

    再次编辑:添加命令行信息。

    程序集文件使用类似于以下内容的命令行生成:

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

    ml 当由自己执行时说:

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

    C文件是用以下命令生成的:

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

    有一些 -I -D 选项传递给 毫升 并且 cl ,但为了简洁起见,我省略了它们。这个 描述了选项 here .

    1 回复  |  直到 11 年前
        1
  •  4
  •   Michael Burr    15 年前

    根据添加到问题中的cl命令行选项进行编辑:

    我认为问题在于 /GL 选项,指定将完成链接时间代码生成优化。从该选项的文档页面:

    使用/gl生成的obj文件对editbin和dumpbin等链接器实用程序不可用。

    使用此选项会导致编译器生成 .obj 链接器可以在其上执行程序范围优化的文件-显然,文件格式是专有的(可能在某个地方有文档记录,但我怀疑没有)。

    文档 /GL (也称为“整个程序优化”、“链路时间代码生成”或LTCG)包含有关 Obj. 包含此类对象文件的文件或库。


    原始答案:

    您要反汇编的.obj文件的C源文件中到底有什么?我得到以下使用 dumpbin /disasm test.obj 对于一个简单的“你好,世界”计划:

    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
    

    注意:这是使用 Obj. 文件编译人和 dumpbin 由VS2005提供,但我无法想象这些东西会比VS2003有多大变化。