Подробное объяснение четырех процессов компиляции GCC.


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

gcc -E hello.c -o hello.i

(1) Удалите все #define и разверните все определения макросов. Грубо говоря, это замена персонажей.

(2) Обработать все инструкции условной компиляции (прекомпиляции), #ifdef #ifndef #endif и т. д., то есть те, которые содержат #.

(3) В условном заявлении те, которые соответствуют условиям решения, будут сохранены, а те, которые не соответствуют, будут удалены.

(3) Обработайте предварительно скомпилированную директиву #include и вставьте файл, на который указывает #include, в эту строку (местоположение предварительно скомпилированной директивы).

(4) Удалить все комментарии.

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

(6) Сохраните директивы компилятора #pragma, поскольку компилятору необходимо их использовать.

(7) Генерировать (.i) временные файлы (включая декомментацию, замену макросов, расширение заголовочного файла и условную компиляцию), а скомпилированные файлы не содержат никаких определений макросов, поскольку макросы были расширены и включены включенные файлы. в файл .i.


Компиляция: проверка на ошибки Суть генерации ассемблерных файлов заключается в компиляции языка высокого уровня в машинно-распознаваемый язык ассемблера.

gcc -S hello.i -o hello.s

(1) Сканирование, синтаксический анализ, семантический анализ, анализ исходного кода, генерация объектного кода и оптимизация объектного кода.

(2) Сгенерируйте ассемблерный код.

(3) Сводные символы.

(4) Создайте файл .s.


Сборка: создание двоичных файлов из файлов сборки.

gcc -c hello.s -o hello.o

(1) Переведите инструкции по сборке в двоичную форму в соответствии с инструкциями по сборке и конкретными платформами.

(2) Объедините каждый раздел и объедините таблицу символов.

(3) Создайте файлы .o.


Связывание: создание двоичных файлов в исполняемые файлы.

gcc hello.o -o hello

(1) Компоновщик связывает объектный файл с необходимыми дополнительными объектными файлами (такими как статическая библиотека, динамическая библиотека), чтобы стать исполняемым файлом.

(2) Объедините разделы каждого файла .obj, объедините таблицу символов и выполните анализ символов.

(3) Перемещение адреса символа.

(4) Создать исполняемые файлы.

Supongo que te gusta

Origin blog.csdn.net/FLM19990626/article/details/129631696
Recomendado
Clasificación