#полезное
🛞
Процесс компиляции GNU от исходного кода до исполняемого файла Процесс начинается с исходного кода в текстовых файлах (например, программы на языке C) и запускается с препроцессора, который часто называют
cpp.
Предположим, исходный код находится в файле
prog.c.
Препроцессор расширяет макросы, подключает заголовочные файлы и обрабатывает директивы, преобразуя исходный код в очищенную версию, которая по-прежнему остаётся в текстовом формате. Например, после обработки препроцессором
cpp файла prog.c может получиться файл
prog.i.
Препроцессор важен для подготовки кода путём раннего разрешения зависимостей, чтобы все определения были на месте до фактической компиляции.
Далее собственно компилятор (например, cc1 или gcc) на основном этапе берёт предварительно обработанный текст и генерирует ассемблерный код.
На этом этапе высокоуровневые инструкции преобразуются в низкоуровневый ассемблер, часто с такими оптимизациями, как преобразование кода. Вы можете увидеть команду
gcc -S -m32 prog.c для вывода
prog.s в текстовом формате.
Ассемблер остаётся читаемым для человека, но ближе к машинному языку, что позволяет преодолеть разрыв между языками программирования и особенностями аппаратного обеспечения.
Ассемблер преобразует этот ассемблерный текст в перемещаемые объектные файлы в двоичном формате.
Эти файлы
.o содержат машинный код, но с заполнителями для адресов, отмеченными в записях перемещения, таких как разделы
.rel.data или
.text. Таблицы символов (
.symtab) отслеживают переменные и функции.
Выполнение команды
gcc -c prog.c компилирует без компоновки, создавая файл prog.o, готовый к объединению с другими файлами.
Компоновка выполняется с помощью
ld, который разрешает символы и перемещает код, подключая библиотечные файлы и другие объектные модули.
Он создаёт исполняемый двоичный файл, например prog из
gcc -o prog prog.c, где всем ссылкам присваиваются фиксированные адреса. На этом этапе выполняется разрешение символов, чтобы вызовы внешних функций работали корректно.
Наконец, загрузчик помещает этот исполняемый файл в память как работающий процесс, сопоставляя разделы и настраивая выполнение.
👉
Новости 👉
База вопросов