Предварительная обработка: без проверки ошибок, замена заголовочного файла, удаление комментариев, условная компиляция.
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) Создать исполняемые файлы.