понедельник, 9 мая 2011 г.

Процесс компиляции утилитой gcc внутри

Выполняя команду gcc, внутри происходят поэтапно следующие шаги:

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


Комментариев нет:

Отправить комментарий