Итак, компиляция исполняемого файла в GCC состоит из 4 частей:
1.) Предварительная обработка (gcc -E main.c> main.i; преобразует * .c в * .i)
Включает в себя расширение, процессы Маркос. Удаляет комментарии.
2.) Компиляция (gcc -S main.i; преобразует * .i в * .s, в случае успеха)
Компилирует C-код в Assembler (в целевой архитектуре x86 это x86-сборка, в целевой архитектуре x86_64 это x64-сборка, в целевой архитектуре arm это сборка arm и т. Д.)
Большинство предупреждений и ошибок происходит во время этой части (например, отчеты об ошибках и предупреждениях)
3.) Сборка (как main.s -o main.o; преобразует * .i в * .o, снова в случае успеха)
Сборки генерируются ассемблером для машинного кода. Хотя есть еще относительный адрес процедур, и такой.
4.) Связывание (gcc main.o)
Заменяет относительные адреса абсолютными адресами. Удаляет бесполезный текст.
Связывание ошибок и предупреждений на этом этапе.
И в конце (если все прошло успешно), мы получаем исполняемый файл.
Итак, чтобы ответить на ваш вопрос, вы имеете в виду промежуточный вывод на самом деле так называемый ассемблерный язык - см. Вики об этом Вики ассемблерный язык .