反汇编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文件的任一实用程序中都得不到有用的结果。
我有几个与这种差异有关的问题:
- MSVC2003编译器生成的目标文件格式是什么?
- 我该如何反汇编该目标文件?
我对使用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
选项传递给ml
和cl
,但为了简洁,我省略了它们。 这里描述了 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中发生很大变化。