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

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

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

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

 cfile.obj: data 

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

使用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 

有一些-I-D选项传递给mlcl ,但为了简洁,我省略了它们。 这里描述了 cl选项。

根据添加到问题的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提供的dumpbin ,但我无法想象这些东西会从VS2003中发生很大变化。