2012-11-18 4 views
11

Ich bin neu in Linux. Kann mir jemand die folgende ausführliche Ausgabe für mein Hello-Weltprogramm erklären? Was machen die Dateien crt1.o, crti.o, crtend.o, crtbegin.o und crtn.o und lc und lgcc? Andere erläuternde Links sind ebenfalls willkommen.GCC Ausführlicher Modus Ausgang Erklärung

$ 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 
+1

Hier ist ein Teil davon: http://dev.gentoo.org/~vapier/crt.txt – ethrbunny

+0

@ethrbunny Danke, das war hilfreich! – Gomathi

Antwort

20

Der erste Teil ist die Versions- und Konfigurationsdaten für den Compiler-Treiber (das ist die gcc binär, was eigentlich nicht der Compiler selbst ist):

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 

Dann druckt er den Befehl verwendet es zu rufen sie den echten Compiler, 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 

und cc1 druckt Version und Konfigurations info ist.

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 

Dann cc1 sagt Ihnen, welche Verzeichnisse für Include-Dateien suchen.

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. 

Der Compiler ist nun abgeschlossen, so gcc Sie den Assembler Befehl teilt es verwenden werden.

as -V -Qy -o /tmp/ccQynbTm.o /tmp/cceCee26.s 

Und der Assembler, as, gibt seine Version Info.

GNU assembler version 2.12.90.0.1 (i386-linux) 
using BFD version 2.12.90.0.1 20020307 Debian/GNU 
Linux 

Der Assembler jetzt getan wird, so gibt gcc den Linker-Befehl. Es verwendet collect2 als Vermittler zu dem echten Linker ld, aber das ist hier nicht wichtig.

/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 

Der Linker gibt keine ausführliche Ausgabe (versuchen -Wl,-v), so das ist es.

Die "CRT" Dateien bedeuten "C RunTime". Sie sind kleine Codeabschnitte, die am Anfang Ihres Programms und am Ende eingefügt werden. Sie kümmern sich um die Initialisierung Ihrer globalen Variablen, Heap und Stack. Sie rufen atexit Funktionen nach Ihrer Rückkehr von main. Und noch etwas mehr.

Hoffe, dass hilft.

+0

Vielen Dank. Es hat sehr geholfen! – Gomathi

+2

Der Linker gibt eine ausführliche Ausgabe, wenn Sie '-Wl, - verbose 'festlegen. Es werden die Versuche gedruckt, alle Eingänge einschließlich der Bibliotheken zu erfassen. – Interarticle

Verwandte Themen