Изучение этапов компиляции при помощи набора компиляторов GCC.

Особенности использования набора компиляторов и утилит GCC.

Цель работы.

Изучить особенности работы с набором компиляторов и утилит GNU Compiler Collection (GCC)

 

При использовании интегрированных средств разработки (англ. Integrated Development Environment - IDE), процесс создания исполняемого файла из исходного текста происходит после нажатия одной кнопки, при этом результат каждого отдельного этапа как правило скрыт от пользователя IDE. Рассмотрим данный процесс поэтапно при помощи набора компиляторов GCC, а также другие его возможности. Дальнейшее описание предполагает работу в операционной системе семейства Windows, с установленным IDE Dev-Cpp. Будет использован набор компиляторов GCC, входящий в состав IDE Dev-Cpp. Путь установки для Dev-Cpp предполагается следующий: C:\dev-cpp. Рабочий каталог для хранения исходных кодов - c:\users. При использовании других путей к рабочему каталогу и Dev-Cpp, необходимо соответствующим образом отредактировать приведённые команды. При использовании операционной системы из семейства Linux не требуется устанавливать IDE Dev-Cpp и указывать путь к программам, входящим в состав GCC.

 

Порядок выполнения работы.

 

Изучение этапов компиляции при помощи набора компиляторов GCC.

 

Для начала создадим простой файл исходного текста программы на языке C с использованием любого текстового редактора (например Notepad) и сохраним его под именем hworld.c в рабочем каталоге.

 

 

#include <stdio.h>

 

int main()

{

 

printf("Hello World\n");

return 0;

}

 

 

После этого можно командой C:\dev-cpp\bin\gcc -o c:\users\hworld.exe c:\users\hworld.c создать исполняемый файл, однако в данной лабораторной рассмотрим каждый этап отдельно. В дальнейшем полный путь к файлам в командах будет опускаться, предполагается что все исходные файлы расположены в рабочем каталоге c:\users. При использовании новой программы из комплекта GCC, путь к ней будет указан лишь в первый раз.

Применив команду gcc -E -o hworld.i hworld.c мы создадим файл hworld.i , содержащий исходный текст, обработанный препроцессором. В данный файл будет добавлено содержимое заголовочных файлов, будут удалены комментарии и раскрыты макросы.

Применив команду gcc -S -o hworld.s hworld.c мы получим файл с ассемблерным кодом, соответствующим исходному тексту.

Результатом команды gcc -c -o hworld.o hworld.c будет объектный файл, содержащий блоки готового к исполнению машинного кода, блоки данных, а также список определенных в файле функций и внешних переменных, но при этом в нем не заданы абсолютные адреса ссылок на функции и данные. Объектный файл не может быть запущен на исполнение непосредственно, но в дальнейшем может быть объединен с другими объектными файлами.

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

 

Оптимизация кода.

GCC позволяет провести оптимизацию кода во время компиляции. Рассмотрим этот процесс. Создадим следующий файл под именем optim.c:

#include <stdio.h>

 

int main()

{

int i;

while (i<=10)

i++;

printf("%d",i);

return 0;

}

Теперь выполним команды

gcc -S optim.c

gcc -S -O1 -o optim1.s optim.c

gcc -S -O2 -o optim2.s optim.c

gcc -S -O3 -o optim3.s optim.c

После этого в файле optim.s будет ассемблерный код без оптимизаций, в файлах optim1.s,optim2.s и optim3.s будет код с различной степенью оптимизации.