Когда вы хотите выполнить код для создания объектного файла, с компьютером необходимо связаться на машинном языке, который представляет собой двоичный код (base-2). К сожалению (и к счастью), люди общаются на языке, который выше двоичного. Следовательно, почему мы используем язык более высокого уровня, такой как Python, Ruby и, в данном случае, язык программирования C. Но для того, чтобы компьютеры могли выполнить наш код C, мы должны скомпилировать код с помощью команды Unix:

GCC main.c

Вот что происходит, когда мы GCC файл main.c

Когда мы компилируем код, происходят три основных шага:
1. Читает исходный файл
2. Обрабатывает его
3. Связывает его с библиотекой времени выполнения.

Многое происходит, когда код обрабатывается. Распаковываем.

У компилятора есть несколько модулей: препроцессор, компилятор, ассемблер и компоновщик.

Когда мы пишем файл main.c, препроцессор генерирует какой-то промежуточный файл, который передается компилятору. Роль компилятора состоит в том, что он компилирует файлы, сгенерированные препроцессором, в качестве входных данных и генерирует ассемблерный код, чтобы он мог преобразовать наш программный файл C в язык ассемблера. Компьютеры могут генерировать только двоичный код, поэтому язык ассемблера - это формат, в котором он должен быть.

Хотя код ассемблера все еще не понимается машиной - его нужно преобразовать в машинный код. Конвертер, выполняющий эту работу: ассемблер. Модуль ассемблера преобразует код сборки в объектный код.

Наконец, компоновщик, последний модуль, связывает объектный код (созданный ассемблером) с кодом библиотечных функций, который мы используем (когда мы пишем наш код). Из этой связи генерируются текстовые файлы.

Давайте подробно рассмотрим каждый модуль.

Препроцессор выполняет 3 задачи: удаляет комментарии из кода, включает файл заголовка (стандартный для файлов C) в сам сгенерированный файл и, если использовались какие-либо макросы, заменяет имя макроса кодом.

Компилятор возьмет код файла (созданный препроцессором) и создаст код сборки. Ассемблерный код состоит из мнемоник, инструкций, определяемых английскими словами.

Ассемблер преобразует код ассемблера в объектный код.

Наконец, компоновщик может играть одну из двух ролей:
1. Может объединять несколько файлов C путем их компиляции в один исполняемый файл.
2. Связывает наш код (сгенерированный из двоичного кода вывода ассемблера ) с кодом функции библиотеки.

Есть два типа связывания: статическое и динамическое. Компоновщик решает, какой тип связывания он будет использовать.

Компоновщик упакует весь код в один файл, известный как файл .exe.