5

Microsoft Visual Studio 2003 ツールによって出力されたオブジェクト ファイルから奇妙な動作と思われるものを見ています。fileユーティリティは私に教えてくれます:

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

アセンブラーによって作成されたオブジェクトの場合、ただし C ファイルからのオブジェクトの場合は、次のようになります。

cfile.obj: data

Microsoft のdumpbinユーティリティとobjdumpcygwin から取得した を使用して、アセンブリでビルドされたファイルを逆アセンブルできますが、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

と に渡される-Iとオプションがいくつかありますが、ここでは簡潔にするためにそれらを省略しました。オプションについては、こちらで説明しています-Dmlclcl

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 に答える