c common.md 3.4 KB

Стадии компиляции

  • Препроцессорная (предварительная) обработка или препроцессор. На этом этапе выполняются директивы препроцессора. При этом директивы удаляются.

    # Выполнить только препроцессорную обработку
    $ gcc main.c -E main_.c
    
  • Преобразование исходного кода на языке с в ассемблерный код или.

    # Это команда выполняет и препроцессорную обработку
    $ 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.

    $ gcc -c main.s -o main.o
    
  • Компоновка одного или нескольких объектных файлов в исполняемый файл. Это по сути налаживание связей.

    $ gcc main.o -o main.exe
    
    $ 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

#include <stdio.h>

int my_func()
{
	printf("My function\r\n");
}

И в main.c добавим вызов функции my_func()

$ gcc -o main main.c func.c # соберет исполняемый файл main

Но правильно будет модули компилировать отдельно и собрать из полученных объектный файлов

$ gcc -c main.c
$ gcc -c func.c
$ gcc -o main main.o func.o
$ ldd main # выведет используемые библиотеки

make
Первая цель в Makefile - это цель по умолчанию

make: main.o func.o

Если добавить m.cpp

make: main.o func.o

То при вызове команды make утилита сама определит язык и нужную команду компилятор.

Сегменты памяти
Запустить программу. Далее...

$ ps -a # выведет список процессов найти PID программы
$ cd /proc/<PID>
$ cat maps # выведет адреса сегментов процесса

~={red}Остановился на 9ой главе=~