Разберите выходные данные компилятора 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.
У меня есть пара вопросов, связанных с этой разницей:
- Какой формат объектного файла генерируется компилятором 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
варианты описаны здесь.
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.