Разберите вывод компилятора Microsoft Visual Studio 2003 - PullRequest
5 голосов
/ 05 мая 2010

Я вижу странное поведение выводимых объектными файлами инструментов 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

Есть некоторые опции -I и -D, переданные ml и cl, но я здесь для краткости опущен. Варианты cl описаны здесь .

1 Ответ

4 голосов
/ 05 мая 2010

Редактирование на основе параметров командной строки cl, добавляемых к вопросу:

Я думаю, что проблема заключается в использовании опции /GL, которая указывает, что будет выполнена оптимизация генерации кода во время соединения. со страницы документа об этой опции:

Файлы obj, созданные с помощью / GL, не будут доступны для таких утилит компоновщика, как EDITBIN и DUMPBIN.

Использование этой опции заставляет компилятор генерировать .obj файлы, с которыми компоновщик может выполнять оптимизацию всей программы - очевидно, формат файла является проприетарным (возможно, он где-то задокументирован, но я подозреваю, что нет).

Документы для /GL (также известные как "оптимизация всей программы", "генерация кода времени ссылки" или LTCG) содержат несколько предупреждений о совместимости файлов .obj или библиотек, содержащих такие файлы объектов.


Оригинальный ответ:

Что именно находится в исходном коде C для файла .obj, который вы пытаетесь разобрать? Я получаю следующее, используя 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

Примечание: здесь используется файл .obj, скомпилированный с помощью dumpbin, предоставленный VS2005, но я не могу себе представить, что этот материал сильно изменился бы по сравнению с VS2003.

...