TGViewer
METANIT.COM METANIT.COM @devnull22 · 5.81K subscribers
Post #1930 1.75K
Процесс компиляции GNU от исходного кода до исполняемого файла (Описание к предыдущему посту)

Процесс начинается с исходного кода в текстовых файлах (например, программы на языке C) и запускается с препроцессора, который часто называют cpp.
Предположим, исходный код находится в файле prog.c.

Препроцессор расширяет макросы, подключает заголовочные файлы и обрабатывает директивы, преобразуя исходный код в очищенную версию, которая по-прежнему остаётся в текстовом формате. Например, после обработки препроцессором cpp файла prog.c может получиться файл prog.i.
Препроцессор важен для подготовки кода путём раннего разрешения зависимостей, чтобы все определения были на месте до фактической компиляции.

Далее собственно компилятор (например, cc1 или gcc) на основном этапе берёт предварительно обработанный текст и генерирует ассемблерный код.

На этом этапе высокоуровневые инструкции преобразуются в низкоуровневый ассемблер, часто с такими оптимизациями, как преобразование кода. Вы можете увидеть команду gcc -S -m32 prog.c для вывода prog.s в текстовом формате.

Ассемблер остаётся читаемым для человека, но ближе к машинному языку, что позволяет преодолеть разрыв между языками программирования и особенностями аппаратного обеспечения.

Ассемблер (обозначается как as) преобразует этот ассемблерный текст в перемещаемые объектные файлы в двоичном формате.

Эти файлы .o содержат машинный код, но с заполнителями для адресов, отмеченными в записях перемещения, таких как разделы .rel.data или .text. Таблицы символов (.symtab) отслеживают переменные и функции.

Выполнение команды gcc -c prog.c компилирует без компоновки, создавая файл prog.o, готовый к объединению с другими файлами.

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

Он создаёт исполняемый двоичный файл, например prog из gcc -o prog prog.c, где всем ссылкам присваиваются фиксированные адреса. На этом этапе выполняется разрешение символов, чтобы вызовы внешних функций работали корректно.

Наконец, загрузчик помещает этот исполняемый файл в память как работающий процесс, сопоставляя разделы и настраивая выполнение.
Telegram METANIT.COM Процесс компиляции GNU от исходного кода до исполняемого файла Описание - https://t.me/devnull22/1930
  • 👍 13
  • ❤ 4
  • 🔥 1
More from @devnull22
  1. Mar 19, 2026Добавил в руководство по JavaScript главу про работу с датами и временем с помощью Tempora…
  2. Mar 19, 2026Роскомнадзор перестал полностью справляться с блокировками в интернете Роскомнадзор (РКН)…
  3. Mar 18, 2026Минцифры опубликовало законопроект о государственном регулировании ИИ. Закон должен начать…
  4. Mar 18, 2026Microsoft призвала разработчиков создавать ИИ-приложения в Electron на Windows 11 Microsof…
  5. Mar 18, 2026Oracle анонсировала проект Detroit, который будет развиваться в составе OpenJDK и нацелен…
  6. Mar 17, 2026Вышла новая версия платформы Java - JDK 26. JDK 26 — краткосрочная версия с поддержкой Pre…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →