Выполняя команду gcc, внутри происходят поэтапно следующие шаги:
- Вызов сpp(с-compatible Сompiller Pre-Processor). Берутся *.c- и *.h-файлы и разворачиваются все
#include, заменяются все#define-ы. На выходе получаются *.i-файлы. - Текст на языке Си *.i-файлов переводятся в тексты на языке Ассемблер. Эти файлы получают расширения *.s(assembler source)
- Вызывается утилита as. Она переводит тексты на языке Ассемблер в машинный код, но при этом импортируемые ссылки(функции,переменным,константам, которые находятся в других файлах, с которыми еще предстоит слинковаться) остаются неразрешенными. Файлы *.s первращаются в файлы *.o (обьектные файлы).
- Вызывается линковщик ld. Его задача обьединить обьектные файлы в один архив и разрешнить импортируемые ссылки. На выходе с линковщика получают либо исполняемые приложения(они обычно не имеют разрешения), либо испольняемые библиотеки(им ставят расширение *.a). Такие архивы создаются утилитой ar. Таким образом из нескольких файлов *.o получается один архив *.a.
- Этот последний пункт выполняется на этапе компиляции не часто. Выполняется утилита strip, она чистит бинарный архив от дебажной информации, таким образом уменшая еще размер архива.
Комментариев нет:
Отправить комментарий