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

Car*_*rum 5 c coff disassembly visual-studio object-files

我看到我认为Microsoft Visual Studio 2003工具输出的目标文件的奇怪行为.该file实用程序告诉我:

asmfile.obj: 80386 COFF executable not stripped - version 30821
Run Code Online (Sandbox Code Playgroud)

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

cfile.obj: data
Run Code Online (Sandbox Code Playgroud)

使用Microsoft的dumpbin实用程序和objdump我从cygwin获得的,我可以反汇编程序集生成的文件,但是我从C-built文件的任一实用程序中都得不到有用的结果.

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

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

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

编辑:添加更多信息.

当我dumpbin在其中一个文件上运行时,没有给出任何结果:

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
Run Code Online (Sandbox Code Playgroud)

objdump,它给出:

$ objdump -d Func.obj
objdump: Func.obj: File truncated
Run Code Online (Sandbox Code Playgroud)

关于从汇编构建的文件,我得到了合理的结果.

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

汇编文件使用类似于以下内容的命令行构建:

ml -nologo -W3 -WX -c -coff -FoAssemblyFile.obj -Zi -Cx AssemblyFile.asm
Run Code Online (Sandbox Code Playgroud)

ml 当自己执行时说:

Microsoft (R) Macro Assembler Version 6.15.8803
Copyright (C) Microsoft Corp 1981-2000.  All rights reserved.
Run Code Online (Sandbox Code Playgroud)

使用以下命令构建C文件:

cl -nologo -W4 -WX -Gs32768 -GX -Gy -c -FdCFile.pdb -FoCFile.obj -Zi 
   -Gm -O1 -Oy- -Gy -GL -X CFile.c
Run Code Online (Sandbox Code Playgroud)

有一些-I-D传递给选项mlcl,但是我在这里省略了对它们的简洁.该cl选项说明这里.

Mic*_*urr 4

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

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

使用 /GL 生成的 obj 文件将不可用于 EDITBIN 和 DUMPBIN 等链接器实用程序。

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

/GL(也称为“整个程序优化”、“链接时代码生成”或 LTCG)的文档包含有关.obj包含此类对象文件的文件或库的互操作性的多个警告。


原答案:

您尝试反汇编的 .obj 文件的 C 源代码中到底包含什么?我得到以下用于dumpbin /disasm test.obj简单的“hello world”程序的信息:

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
Run Code Online (Sandbox Code Playgroud)

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