Процесс компиляции программ на C, как это работает?!

Давайте поговорим о C, что это такое?

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

Вам, как программисту, может понадобиться написать его исходный код с помощью любого редактора в виде текстового файла, после чего он должен быть скомпилирован в машинный код.

Для этого перед компиляцией кода необходимо выполнить 4 шага: предварительная обработка, компиляция, сборка, компоновка.

Я буду использовать этот пример в этом посте

Предварительная обработка:

Это первый шаг, препроцессор работает с директивами, которые представляют собой команды, начинающиеся с #, а затем начинает удалять комментарии, расширять макросы и расширять файлы, включенные в код.

Если вы включите файл заголовка, такой как #include ‹stdio.h›, он будет искать файл с именем stdio.h и копировать файл заголовка в файл исходного кода. Константы, определенные с помощью #define, также генерируются препроцессором.

Чтобы распечатать результат этапа предварительной обработки, передайте опцию -E в gcc

gcc -E hello_world.c

Компиляция:

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

Чтобы сохранить результат этапа компиляции, передайте опцию -S в gcc:

gcc -S hello_world.c

Файл с именем hello_world.s, содержащий инструкции по сборке, будет создан со следующим выводом:

Сборка

Совенгеры... Собирайтесь! Это третий шаг, ассемблер преобразует код в чистый двоичный код или машинный код. Также известен как объектный код.

Если мы хотим сохранить результат этапа сборки, нам нужно передать опцию -c в gcc:

gcc -c hello_world.c

будет создан файл с именем hello_world.o, содержащий объектный код программы.

но если мы хотим проверить его содержимое, нам нужно использовать команды hexdump или od, выполнив одну из следующих команд:

hexdump hello_world.o
od -c hello_world.o

Связывание:

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

В нашу программу «Hello, World» компоновщик добавит объектный код для функции puts. Результатом будет исполняемый файл, при запуске без параметров имя этого файла будет a.out. Для отличного именования вам нужно передать параметр -o в gcc:

gcc -o hello_world hello_world.c

Спасибо за чтение!

Я надеюсь, что это объяснение поможет вам, не забудьте прочитать справочную страницу gcc для получения дополнительной информации. Да пребудет с тобой сила!