Стадии компиляции
- Препроцессорная (предварительная) обработка или препроцессор. На этом этапе выполняются директивы препроцессора. При этом директивы удаляются.
```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ой главе=~