Ответ 1
Прочитайте некоторый материал о внутренностях GCC. Сначала википейдж на GCC. Затем вы можете поиграть с датчиком MELT (возможно, вы захотите использовать систему Linux). Затем прочитайте руководство GCC. И GCC ресурсный центр
Используйте gcc -v -Wall
для компиляции, он покажет, что работает cc1
(и -Wall
всегда полезен). Поэтому попробуйте скомпилировать с помощью gcc -v -Wall hello.c -o helloworld.bin
программа cc1
не в вашем PATH
или в /usr/bin/
а -o в моем system- в /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1
Команда gcc -print-prog-name=cc1
скажет вам, какой cc1
используется вашим gcc
. Посмотрите варианты отладки GCC для больше.
cc1
обработка теперь внутри cc1
.
Программа gcc
- это просто драйвер, cc1
(который выполняет большую часть работы по компиляции), затем as
, ld
т.д.
Сайт MELT содержит некоторую документацию и несколько слайдов, объясняющих GCC, которые вы могли бы найти интересными. MELT - это предметно-ориентированный язык для расширения GCC.
Смотрите также картинку на http://starynkevitch.net/Basile/gcc-melt/cc1-internals.svg и картинку ниже.
фотография с http://starynkevitch.net/Basile/gcc-melt/gcc-MELT-inside.png, сделанная мной, CC BY SA
cc1
создает файл сборки .s
; as
(запущенный gcc
) превращает его в .o
. Линкер ld
(запущенный gcc
) создаст библиотеку или исполняемый файл.
PS. У меня есть система Linux, но на MacOSX все очень похоже.
ссылка на ссылку
Хорошей книгой о линковке является Levine Linkers & loaders book.