Этапы процесса компиляции

Что происходит, когда вы набираете gcc main.c

Мы собираемся проанализировать, что происходит, когда мы набираем команду
gcc main.c и изучаем четыре основных этапа процесса компиляции.

  1. Предварительная обработка
  2. Компиляция
  3. сборка
  4. Связывание

Прежде чем мы начнем, давайте создадим наш файл .c и запустим команду, чтобы посмотреть, что произойдет. См. Пример 1

Итак, мы создали файл в main.c и написали внутри программы на C, которая будет печатать «Hello, world». После компиляции был создан исполняемый файл a.out. Мы тестируем его, и он действительно напечатал «Hello, world». Теперь давайте задумаемся глубже и зададимся вопросом, что именно произошло и как мы закончили с a.out!

1. ПРЕДВАРИТЕЛЬНАЯ ОБРАБОТКА

Это самый первый этап, через который проходит исходный код. На этом этапе решаются следующие задачи:

  1. Макроподстановка
  2. Комментарии удалены
  3. Расширение включаемых файлов

Чтобы лучше понять предварительную обработку, мы собираемся скомпилировать указанную выше программу «main.c» с использованием флага -E, который будет выводить предварительно обработанный вывод на стандартный вывод. См. Пример 2!

Примечание. Мы могли сохранить вывод в файл, используя флаг -o имя файла.

Чтобы двигаться дальше и прояснить ситуацию, мы воспользуемся следующей командой:
$ gcc -save-temps main.c

Флаг -save-temps укажет компилятору хранить временные промежуточные файлы, используемые компилятором gcc, в текущем каталоге. Итак, мы получим файлы main.i, main.s, main.o вместе с исполняемым файлом a.out.
См. пример 3.

Примечание. Мы получаем a.out в качестве имени исполняемого файла, потому что мы не определяем его в нашей команде. Чтобы указать имя выходного файла, используйте флаг -o после имени.

2. СОСТАВЛЕНИЕ

После того, как компилятор завершит этап предварительной обработки. Следующим шагом является использование main.i в качестве входных данных, его компиляция и создание промежуточного скомпилированного вывода. Выходным файлом для этого этапа является «main.s». Вывод, представленный в main.s, — это инструкции уровня сборки. См. Пример 4!

См. также:  Как получить имя пользователя GitHub своей мечты

3. СБОРКА

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

Поскольку на этом этапе выводится файл машинного уровня, он совершенно нечитаем и будет выглядеть так, как в примере 5.

Глядя на этот вывод, мы можем объяснить только
ELF = Executable and Linkable Format
Hello, world = контент, который будет отображаться, который мы ввели в main.c
и версию Ubuntu, которую GCC компилятор запущен из.

4. СВЯЗЬ

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

После объединения стандартного кода компоновщик преобразует файл .o в исполняемый файл (по умолчанию a.out).

См. также:  Как инициализировать вектор указателей

Я надеюсь, что эта статья помогла вам понять общую концепцию компиляции программы на C.

Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: