тип вывода gcc / g ++ - PullRequest
       12

тип вывода gcc / g ++

8 голосов
/ 12 февраля 2012

Я знаю, что это очень простой вопрос, но когда я компилирую свой код c / c ++ с помощью gcc / g ++, каков тип промежуточного вывода перед тем, как ассемблер вступит в игру для генерации машинного кода?Это что-то вроде инструкции X86?

Ответы [ 6 ]

12 голосов
/ 12 февраля 2012

Цепочка обработки GCC выглядит следующим образом:

  • ваш исходный код

  • предварительно обработанный исходный код (разверните макросы и включите, удалите комментарии) (-E, .ii)

  • компилировать в сборку (-S, .s)

  • сборка в двоичный файл (-c, .o)

  • ссылка на исполняемый файл

На каждом этапе я перечислял соответствующие флаги компилятора, которые останавливали процесс, а также суффикс соответствующего файла.

Если вы компилируете с -flto, тогда объектные файлы будут украшены байт-кодом GIMPLE, который является типом низкоуровневого промежуточного формата, целью которого является задержка фактической окончательной компиляции до стадии связывания, которая позволяет для оптимизации времени соединения.

Собственно этап «компиляции» - это фактическая тяжелая часть. Препроцессор - это, по сути, отдельный, независимый инструмент (хотя его поведение определяется стандартами C и C ++), а ассемблер и компоновщик являются совершенно отдельными, автономными инструментами, которые в основном просто реализуют, соответственно, двоичный формат команд оборудования и загружаемый исполняемый формат операционной системы.

4 голосов
/ 12 февраля 2012

Итак, компиляция исполняемого файла в 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) Заменяет относительные адреса абсолютными адресами. Удаляет бесполезный текст. Связывание ошибок и предупреждений на этом этапе. И в конце (если все прошло успешно), мы получаем исполняемый файл.

Итак, чтобы ответить на ваш вопрос, вы имеете в виду промежуточный вывод на самом деле так называемый ассемблерный язык - см. Вики об этом Вики ассемблерный язык .

2 голосов
/ 12 февраля 2012

Графическое представление шагов компиляции gcc предоставлено redhat magazine :

gcc compilation steps

Вопреки тому, что подразумевают другие ответы, нет этапа сборки - скорее, генерация ассемблерного кода заменяет генерацию объектного кода; нет смысла преобразовывать представление в памяти в текстовое, если вы действительно хотите получить двоичное представление.

0 голосов
/ 12 февраля 2012

Цепочка инструментов GCC, компилирует программу из исходного кода в машинный код. Компилятор генерирует ассемблерный код, который ассемблер собирает в машинный код. Здесь - хороший учебник для начинающих.

0 голосов
/ 12 февраля 2012

Нет «промежуточного выхода».Первый вывод, который вы получите, это машинный код.(Хотя вы можете получить промежуточный вывод C / C ++, вызвав only препроцессор с -E.)

0 голосов
/ 12 февраля 2012

Это должен быть код сборки.Вы можете получить его, используя -S флаг в командной строке для компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...