Я вижу то, что я думаю, странное поведение от объектных файлов, произведенных инструментами Microsoft Visual Studio 2003. file
утилита говорит мне:
asmfile.obj: 80386 COFF executable not stripped - version 30821
Для объектов, созданных ассемблером, но для объектов, прибывающих из файлов C, я становлюсь справедливым:
cfile.obj: data
Использование Microsoft dumpbin
утилита и objdump
Я добрался от cygwin, я могу демонтировать созданный из блока файл, но я не получаю полезных результатов ни одной утилиты для файлов C-built.
У меня есть несколько вопросов, связанных с этим различием:
Я особенно интересуюсь получением дизассемблирования в синтаксисе 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
, которая указывает, что будет произведена оптимизация генерации кода во время соединения. из документальной страницы по этой опции:
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.