分解微软Visual Studio 2003编译器输出

5

我发现微软Visual Studio 2003工具输出的目标文件表现出了奇怪的行为。使用file命令检查时,显示如下:

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

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

cfile.obj: data

使用微软的 dumpbin 工具和从cygwin获取的 objdump ,我可以反汇编汇编生成的文件,但是对于C语言生成的文件,这两个工具都没有有用的结果。
我有一些与这种差异相关的问题:
  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

使用objdump命令,会得到以下结果:
$ 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

这里有一些传递给 mlcl 的选项,包括 -I-D 选项,但由于篇幅原因,在此省略了它们。关于 cl 选项的描述可以在这里找到。

1个回答

4

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

我认为问题在于使用了/GL选项,该选项指定将执行链接时代码生成优化。从该选项的文档页面中可以看到:

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

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

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


原始答案:

您要反汇编的.obj文件的C源代码中究竟有什么? 对于简单的“hello world”程序,我使用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

注意:这里使用的是由VS2005编译的.obj文件和提供的dumpbin,但我想这些东西在VS2003中应该没有太大变化。


我会编辑以添加更多细节。据我所知,C源代码可以是任何东西 - 此整个项目中的每个对象输出都具有相同的行为。 - Carl Norum
“file”命令可以告诉你对象文件的类型是什么? - Carl Norum
文件5.03(来自GnuWin32包)显示:test.obj; 80386 COFF可执行文件未剥离 - 版本25970 - Michael Burr
@Carl:你可能想发布用于创建基于C的.obj的确切命令行。也许某些选项导致事情走向错误的方向(你没有使用/clr开关,是吗?)。 - Michael Burr
在我的情况下,我移除了/GL/LTCG并添加了/Od。然后我可以使用dumpbin /disasm与obj文件。 - smwikipedia
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接