Разберите выходные данные компилятора Microsoft Visual Studio 2003

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

Решение

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

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

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

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

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


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

Что именно находится в исходном коде C для файла.obj, который вы пытаетесь разобрать? Я получаю следующее, используя dumpbin /disasm test.obj для простой программы "Здравствуй, мир":

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.

Другие вопросы по тегам