Ich habe versucht, den Fluss vom Quellcode zur Erstellung des Ausführungsformats mit GCC zu sehen.
x86_64 centos7 gcc4.8.3
helloWorld
include <stdio.h>
int main(){
printf("Hello world!!");
}
GCC Versuchen Sie zu kompilieren
gcc hello.c -Wall -v
Ich verwende die eingebaute Spezifikation.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.3/lto-wrapper
Ziel: x86_64-redhat-linux
Einstellungen konfigurieren: ../configure --prefix = / usr --mandir = / usr / share / man --infodir = / usr / share / info --with-bugurl = http: //bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads = posix --enable-testing = release --with-system-zlib --enable -__ cxa_atexit --disable-libunwind-Ausnahmen --enable-gnu-unique -Objekt --enable-Linker-Build-ID --mit-Linker-Hash-Stil = gnu --enable-Sprachen = c, c ++, objc, obj-c ++, Java, fortran, ada, go, lto --enable -plugin --enable-initfini-array --disable-libgcj --with-isl = / builddir / build / BUILD / gcc-4.8.3-20140911 / obj-x86_64-redhat-linux / isl-install --with- cloog = / builddir / build / BUILD / gcc-4.8.3-20140911 / obj-x86_64-redhat-linux / cloog-install - Enable-Gnu-indirekte-Funktion --with-Tune = generisch --with-Arch_32 = x86-64 --build = x86_64-redhat-linux
Gewindemodell: Posix
gcc Version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC)
COLLECT_GCC_OPTIONS='-Wall' '-v' '-mtune=generic' '-march=x86-64'
/usr/libexec/gcc/x86_64-redhat-linux/4.8.3/cc1 -quiet -v hello.c -quiet -dumpbase hello.c -mtune=generic -march=x86-64 -auxbase hello -Wall -version -o /tmp/ccyCCZPY.s
GNU C (GCC) version 4.8.3 20140911 (Red Hat 4.8.3-9) (x86_64-redhat-linux)
compiled by GNU C version 4.8.3 20140911 (Red Hat 4.8.3-9), GMP version 5.1.1, MPFR version 3.1.1, MPC version 1.0.1
warning: GMP header version 5.1.1 differs from library version 6.0.0.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Ignorieren Sie das nicht vorhandene Verzeichnis "/usr/lib/gcc/x86_64-redhat-linux/4.8.3/include-fixed".
Ignorieren Sie das nicht vorhandene Verzeichnis "/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../x86_64-redhat-linux/include".
# Die Suche nach include "..." beginnt hier:
# Die Suche nach include <...> beginnt hier:
/usr/lib/gcc/x86_64-redhat-linux/4.8.3/include
/usr/local/include
/usr/include
Das Ende der Suchliste.
GNU C (GCC) version 4.8.3 20140911 (Red Hat 4.8.3-9) (x86_64-redhat-linux)
compiled by GNU C version 4.8.3 20140911 (Red Hat 4.8.3-9), GMP version 5.1.1, MPFR version 3.1.1, MPC version 1.0.1
warning: GMP header version 5.1.1 differs from library version 6.0.0.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 0cfa3e41c61de51fe5b3d2388f47f98a
hallo.c: In der Funktion 'main':
hallo.c: 5: 1: WARNUNG: Die Steuerung hat das Ende der nicht leeren Funktion erreicht [-Wreturn-Typ]
}
^
COLLECT_GCC_OPTIONS='-Wall' '-v' '-mtune=generic' '-march=x86-64'
as -v --64 -o /tmp/ccYhWWtz.o /tmp/ccyCCZPY.s
Verwenden Sie GNU Assembler Version 2.23.52.0.1 (x86_64-redhat-linux), BFD Version 2.23.52.0.1-30.el7_1.2 20130226
COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.3/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.3/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.8.3/:/usr/lib/gcc/x86_64-redhat-linux/
LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.3/:/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-Wall' '-v' '-mtune=generic' '-march=x86-64'
/usr/libexec/gcc/x86_64-redhat-linux/4.8.3/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64
-dynamic-linker /lib64/ld-linux-x86-64.so.2
/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../lib64/crt1.o
/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-redhat-linux/4.8.3/crtbegin.o
-L/usr/lib/gcc/x86_64-redhat-linux/4.8.3
-L/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../lib64
-L/lib/../lib64
-L/usr/lib/../lib64
-L/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../..
/tmp/ccYhWWtz.o
-lgcc --as-needed -lgcc_s --no-as-needed
-lc
-lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/x86_64-redhat-linux/4.8.3/crtend.o
/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../lib64/crtn.o
Was ist eingebaute Spezifikation
A specs file is plain text used to control the default behavior for the "gcc" front-end.
Es scheint, dass Sie es normalerweise nach innen nehmen und überschreiben können, wenn Sie es nach draußen bringen. Es sieht so aus.
COLLECT_LTO_WRAPPER Es ist ein Plug-In, das von GCC verwendet wird und intern verwendet wird, um die Arbeit effizienter zu gestalten.
Es scheint, dass Sie die Konfigurationseinstellungen sehen können, wenn Sie GCC erstellt haben.
/ usr / libexec / gcc / x86_64-redhat-linux / 4.8.3 / cc1
ist der eigentliche Compiler. Der kompilierte Assembler wird in "/ tmp / ccyCCZPY.s" ausgegeben, das durch -o angegeben wird.
/usr/libexec/gcc/x86_64-redhat-linux/4.8.3/cc1
-quiet -v hello.c -quiet -dumpbase hello.c -mtune=generic -march=x86-64 -auxbase hello -Wall -version -o /tmp/ccyCCZPY.s
Die Objektdatei / tmp / ccYhWWtz.o
mit der Assembler-Datei / tmp / ccyCCZPY.s
wird durch Kompilierung als Eingabewert ausgegeben
Wird ausgegeben.
as -v --64 -o /tmp/ccYhWWtz.o /tmp/ccyCCZPY.s
/ usr / libexec / gcc / x86_64-redhat-linux / 4.8.3 / collect2
ist der eigentliche Linker.
Erstellen Sie ein ausführbares Format, indem Sie die zusammengestellte Objektdatei "/ tmp / ccYhWWtz.o" mit verschiedenen Objekten verknüpfen.
GCC verknüpft gemeinsam genutzte Bibliotheken dynamisch, sofern nicht anders angegeben. Daher wird der dynamische Linker angegeben, der beim Ausführen des Programms verknüpft wird. Wenn -static angegeben ist, wird die gemeinsam genutzte Bibliothek auch statisch verknüpft. Dynamischer Link → Dynamischer Linker
-dynamic-linker /lib64/ld-linux-x86-64.so.2
Diese unten werden vor dem Hauptteil von C aufgerufen, um verschiedene Dinge vorzubereiten, und werden vor dem Ende des Programms aufgerufen, um aufzuräumen. Dies sollte normalerweise statisch verknüpft sein.
-l
Extrahieren Sie xxx nach -l und verknüpfen Sie libxxx.so für dynamische Verknüpfungen und libxxx.a für statische Verknüpfungen. Selbst im Fall einer dynamischen Verbindung scheint sie nach .a zu suchen, wenn dies nicht der Fall ist.
Diesmal ist xxx eine dynamische Verknüpfung mit c, also Verknüpfung libc.so
(Standard-C-Bibliothek)
Ich fühle mich wie ich. (Sollte dynamisch verknüpft sein)
ldd a.out
linux-gate.so.1 => (0xb776e000)
libc.so.6 => /lib/libc.so.6 (0x49cbd000)
/lib/ld-linux.so.2 (0x49c95000)
-L Geben Sie den Suchort der Bibliothek an
Der Compiler erstellt Ausführungsformate in der folgenden Reihenfolge. (Hmm, es scheint, dass der Präprozessor nicht angegeben ist.)
GCC erledigt intern viel Arbeit. Die Substanz im engeren Sinne des Compilers ist cc1. Das Verknüpfen wird jedoch auch als Kompilieren und Erstellen bezeichnet. Sie können sehen, dass verschiedene Objekte nur durch Kompilieren von C verknüpft sind, was nur eine Welt ist.
Recommended Posts