Объяснение вывода подробного режима GCC

Я новичок в линуксе. Может ли кто-нибудь объяснить мне следующий подробный вывод режима для моей программы hello world? Кроме того, что делают файлы crt1.o, crti.o, crtend.o, crtbegin.o и crtn.o и lc и lgcc? Любые другие пояснительные ссылки также приветствуются.

$ gcc -v hello.c

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
 /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
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
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.
 as -V -Qy -o /tmp/ccQynbTm.o /tmp/cceCee26.s
GNU assembler version 2.12.90.0.1 (i386-linux)
using BFD version 2.12.90.0.1 20020307 Debian/GNU
Linux
/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

person Gomathi    schedule 18.11.2012    source источник
comment
Вот одна его часть: dev.gentoo.org/~vapier/crt.txt   -  person ethrbunny    schedule 18.11.2012
comment
@ethrbunny Спасибо, это было полезно!   -  person Gomathi    schedule 18.11.2012


Ответы (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. И еще кое-что кроме.

Надеюсь, это поможет.

person ams    schedule 19.11.2012
comment
Компоновщик выдает подробный вывод, если вы установите -Wl,--verbose. Он будет печатать попытки получить все входные данные, включая библиотеки. - person Interarticle; 09.01.2015
comment
Это точно заслуживает большего, чем +28!? Очень полезно. Спасибо @ams - person nickform; 26.01.2021