Использование GCC для создания читаемой сборки?

Мне было интересно, как использоватьНКУ в мой исходный файл C, чтобы вывести мнемоническую версию машинного кода, чтобы я мог видеть, во что компилируется мой код. Вы можете сделать это с Java, но я не смог найти способ с GCC.

Я пытаюсь переписать метод C на ассемблере и посмотреть, как это делает GCC, было бы очень полезно.

 phuclv30 нояб. 2014 г., 07:33
 Javier17 авг. 2009 г., 21:27
обратите внимание, что «байт-код» обычно означает код, потребляемый виртуальной машиной, такой как JVM или CLR .NET. Выходные данные GCC лучше называть «машинный код», «машинный язык» или «язык ассемблера»
 Peter Cordes05 сент. 2016 г., 22:46
Дополнительные советы о том, как сделать вывод asm читабельным, см. Также:Как убрать «шум» из выходных данных сборки GCC / clang?
 Shafik Yaghmour12 сент. 2014 г., 04:35
Я добавил ответ, используя godbolt, так как это очень мощный инструмент для быстрого экспериментирования с тем, как различные опции влияют на генерацию кода.

Ответы на вопрос(1)

Решение Вопроса

вы можете использоватьobjdump произвести более читаемую разборку.

>objdump --help
[...]
-S, --source             Intermix source code with disassembly
-l, --line-numbers       Include line numbers and filenames in output

objdump -drwC -Mintel это мило:

-r показывает имена символов при перемещении (так что вы увидитеputs вcall инструкция ниже)-R показывает динамическое связывание перемещений / имен символов (полезно для разделяемых библиотек)-C освобождает имена символов C ++-w это "широкий" режим: он не переносит байты машинного кода-Mintel: используйте GAS / binutils MASM-like.intel_syntax noprefix синтаксис вместо AT & T-S: чередовать исходные строки с разборкой.

Вы могли бы поставить что-то вродеalias disas="objdump -drwCS -Mintel" в вашей~/.bashrc

Пример:

> gcc -g -c test.c
> objdump -d -M intel -S test.o

test.o:     file format elf32-i386


Disassembly of section .text:

00000000 <main>:
#include <stdio.h>

int main(void)
{
   0:   55                      push   ebp
   1:   89 e5                   mov    ebp,esp
   3:   83 e4 f0                and    esp,0xfffffff0
   6:   83 ec 10                sub    esp,0x10
    puts("test");
   9:   c7 04 24 00 00 00 00    mov    DWORD PTR [esp],0x0
  10:   e8 fc ff ff ff          call   11 <main+0x11>

    return 0;
  15:   b8 00 00 00 00          mov    eax,0x0
}
  1a:   c9                      leave  
  1b:   c3                      ret
 James17 авг. 2009 г., 21:39
Есть ли переключатель, чтобы захватить только инструкции Intel?
 toto18 авг. 2009 г., 06:01
Все это инструкции Intel, поскольку они работают на процессорах Intel: D.

Ваш ответ на вопрос