Стадии компиляции
- Препроцессорная (предварительная) обработка или препроцессор. На этом этапе выполняются директивы препроцессора. При этом директивы удаляются. ```bash # Выполнить только препроцессорную обработку $ gcc main.c -E main_.c ``` - Преобразование исходного кода на языке с в ассемблерный код или. ```bash # Это команда выполняет и препроцессорную обработку $ gcc -S main_.c -o main.s # Чтобы сократить ассемблерный код можно убрать отладочные директивы $ gcc -S main_.c -o main.s -fno-asynchronous-unwind-table ``` - Преобразование файла с ассемблерным кодом в объектный файл - ассемблирование. На выходе получится бинарный файл. В линукс это ELF - executable and linkable format, а в windows это PE - portable executable. ```bash $ gcc -c main.s -o main.o ``` - Компоновка одного или нескольких объектных файлов в исполняемый файл. Это по сути налаживание связей. ```bash $ gcc main.o -o main.exe ``` ```bash $ cc main.c # создаст исполняемый файл main.out $ cc -v main.c # тоже, но с выводом информации $ gcc -E main.c # остановиться после препроцессора $ gcc -S main.c # остановиться после ассемблера на втором этапе (main.s) $ gcc -c main.c # остановиться после ассемблирования перед компановкой, получится объектный модуль $ objdump -x main.o # вывести объектный файл в читаемом виде $ nm mian.o # менеджер имен $ gcc -o main main.c # получить исполняемый файл с именем main ``` Создадим файл `func.c` ```c #include int my_func() { printf("My function\r\n"); } ``` И в main.c добавим вызов функции `my_func()` ```bash $ gcc -o main main.c func.c # соберет исполняемый файл main ``` Но правильно будет модули компилировать отдельно и собрать из полученных объектный файлов ```bash $ gcc -c main.c $ gcc -c func.c $ gcc -o main main.o func.o ``` ```bash $ ldd main # выведет используемые библиотеки ```
make
Первая цель в Makefile - это цель по умолчанию ```make make: main.o func.o ``` Если добавить m.cpp ```make make: main.o func.o ``` То при вызове команды `make` утилита сама определит язык и нужную команду компилятор.
Сегменты памяти
Запустить программу. Далее... ```bash $ ps -a # выведет список процессов найти PID программы $ cd /proc/ $ cat maps # выведет адреса сегментов процесса ``` ~={red}Остановился на 9ой главе=~