Стадии компиляции
- препроцессор - компилятор - ассемблер - компоновщик ```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 # выведет адреса сегментов процесса ```