прежде чем мы ответим на этот вопрос, давайте попробуем немного разобраться в программировании на C.

во-первых, что такое язык программирования C?

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

C был первоначально разработан Деннисом Ритчи в Bell Labs между 1972 и 1973 годами для создания утилит, работающих в Unix. Позже он был применен для повторной реализации ядра операционной системы Unix. В течение 1980-х годов C постепенно набирал популярность. В настоящее время это один из наиболее широко используемых языков программирования, компиляторы C от различных поставщиков доступны для большинства существующих компьютерных архитектур и операционных систем.

что за ГНУ?

— это операционная система и обширная коллекция компьютерного программного обеспечения. Оно полностью состоит из свободного программного обеспечения, большая часть которого распространяется под собственной Стандартной общественной лицензией (GPL) проекта GNU.

что такое компилятор?

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

что такое ГЦК?

Коллекция компиляторов GNU (GCC) — это система компиляторов, созданная в рамках проекта GNU и поддерживающая различные языки программирования. GCC является ключевым компонентом цепочки инструментов GNU и стандартным компилятором для большинства проектов, связанных с GNU и Linux, включая ядро ​​Linux. Фонд свободного программного обеспечения (FSF) распространяет GCC под Стандартной общественной лицензией GNU (GNU GPL). GCC сыграл важную роль в развитии свободного программного обеспечения как инструмент и пример.

Когда он был впервые выпущен в 1987 году, GCC 1.0 был назван компилятором GNU C, поскольку он работал только с языком программирования C.[1] В декабре того же года он был расширен для компиляции C++. Позже интерфейсные интерфейсы были разработаны для Objective-C, Objective-C++, Fortran, Java, Ada и Go, среди прочих.

теперь давайте вернемся к нашему вопросу, что происходит, когда вы набираете gcc main.c?

сначала давайте создадим наш файл C

(например, я использую emacs, вы можете использовать любой редактор, который хотите)

Emacs main.c

после открытия редактора набираем просто привет мир

#include ‹stdio.h›int main(void)
{
printf("Hello World!\n");
return (0);
}

давайте наберем gcc main.c и посмотрим, что происходит во внешнем интерфейсе

это просто хахаха. давайте теперь посмотрим реальную вещь, которая является бэкэндом

Однако он не делает это автоматически, и есть несколько важных шагов, которые я могу изложить для вас, как я сделал выше. На этот раз я собираюсь подробно остановиться на том, что они из себя представляют и что они делают.

  1. Предварительная обработка — это первый этап любой компиляции C. Обрабатывает include-файлы, инструкции условной компиляции и макросы.

2. Компиляция — это второй проход. Он принимает выходные данные препроцессора и исходный код и генерирует исходный код на ассемблере.

3. Сборка — это третий этап компиляции. Он берет исходный код сборки и создает листинг сборки со смещениями. Вывод ассемблера хранится в объектном файле.

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

ОБЪЕКТНЫЕ ФАЙЛЫ и ИСПОЛНЯЕМЫЕ ФАЙЛЫ

После того, как исходный код будет собран, он создаст объектные файлы (например, .o, .obj), а затем скомпонует их, создав исполняемые файлы.

Объект и исполняемый файл бывают нескольких форматов, таких как ELF (формат исполняемого файла и связывания) и COFF (общий формат объектного файла). Например, ELF используется в системах Linux, а COFF — в системах Windows.

Несколько других форматов файлов

  • a.out Формат a.out является исходным форматом файлов для Unix.
  • COFF Действие COFF (Common Object File Format) ограничено.
  • Когда мы изучаем содержимое этих объектных файлов, есть области, называемые разделами. Разделы могут содержать исполняемый код, данные, информацию о динамической компоновке, отладочные данные, таблицы символов, информацию о перемещении, комментарии, таблицы строк и примечания.

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