Ответ 1
Первая часть - это версия и данные конфигурации для драйвера компилятора (это двоичный код gcc
, который на самом деле не является самим компилятором):
Reading specs from /usr/lib/gcc-lib/i686/3.3.1/specs
Configured with: ../configure --prefix=/usr
Thread model: posix
gcc version 3.3.1
Затем он печатает команду, которую он использует для вызова реального компилятора, cc1
:
/usr/lib/gcc-lib/i686/3.3.1/cc1 -quiet -v -D__GNUC__=3
-D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=1
hello.c -quiet -dumpbase hello.c -auxbase hello -Wall
-version -o /tmp/cceCee26.s
И cc1
печатает его версию и конфигурационную информацию.
GNU C version 3.3.1 (i686-pc-linux-gnu)
compiled by GNU C version 3.3.1 (i686-pc-linux-gnu)
GGC heuristics: --param ggc-min-expand=51
--param ggc-min-heapsize=40036
Затем cc1
сообщает вам, какие каталоги будут искать включенные файлы.
ignoring nonexistent directory "/usr/i686/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/include
/usr/lib/gcc-lib/i686/3.3.1/include
/usr/include
End of search list.
Теперь компилятор завершен, поэтому gcc
сообщает вам команду ассемблера, которую он будет использовать.
as -V -Qy -o /tmp/ccQynbTm.o /tmp/cceCee26.s
И ассемблер as
предоставляет информацию о своей версии.
GNU assembler version 2.12.90.0.1 (i386-linux)
using BFD version 2.12.90.0.1 20020307 Debian/GNU
Linux
Теперь ассемблер выполнен таким образом, что gcc
дает команду компоновщика. Он использует collect2
в качестве посредника к реальному компоновщику ld
, но это не важно здесь.
/usr/lib/gcc-lib/i686/3.3.1/collect2
--eh-frame-hdr -m elf_i386 -dynamic-linker
/lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o
/usr/lib/gcc-lib/i686/3.3.1/crtbegin.o
-L/usr/lib/gcc-lib/i686/3.3.1
-L/usr/lib/gcc-lib/i686/3.3.1/../../.. /tmp/ccQynbTm.o
-lgcc -lgcc_eh -lc -lgcc -lgcc_eh
/usr/lib/gcc-lib/i686/3.3.1/crtend.o
/usr/lib/crtn.o
Компоновщик не дает подробного вывода (попробуйте -Wl,-v
), чтобы он.
Файлы "crt" означают "C RunTime". Это небольшие разделы кода, вставленные в начале вашей программы, и в конце. Они заботятся об инициализации глобальных переменных, кучи и стека. Они вызывают функции atexit
после возврата из main
. И еще кое-что.
Надеюсь, что это поможет.