5

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

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

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

cfile.obj: data

使用 Microsoft 的dumpbin实用程序和objdump我从 cygwin 获得的工具,我可以反汇编程序集构建的文件,但是对于 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

有一些-Iand-D选项传递给ml和 to cl,但为了简洁起见,我在这里省略了它们。此处描述了这些cl选项。

4

1 回答 1

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

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

于 2010-05-05T18:55:27.357 回答