[LINUX] Fluss vom Quellcode zum Erstellen des Ausführungsformats

Überblick

Ich habe versucht, den Fluss vom Quellcode zur Erstellung des Ausführungsformats mit GCC zu sehen.

Umgebung

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

Eingebaute Spezifikationen

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.

Einstellungen konfigurieren:

Es scheint, dass Sie die Konfigurationseinstellungen sehen können, wenn Sie GCC erstellt haben.

kompilieren

/ 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

Assembler

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

Linker

/ 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.

Dynamische Linker-Bezeichnung

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

Derjenige, der implizit verknüpft

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.

  1. crtn.o
  2. crtend.o
  3. crtbegin.o
  4. crti.o
  5. crt1.o
Verknüpfen Sie andere Bibliotheken

-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

Zusammenfassung

Der Compiler erstellt Ausführungsformate in der folgenden Reihenfolge. (Hmm, es scheint, dass der Präprozessor nicht angegeben ist.)

  1. Vorverarbeitung
  2. Kompilieren
  3. Zusammenbauen
  4. Verknüpfen

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

Fluss vom Quellcode zum Erstellen des Ausführungsformats
Installieren Sie ansible aus dem Quellcode
Ich habe ein Paket erstellt, um eine ausführbare Datei aus dem Hy-Quellcode zu erstellen
Migrieren Sie von VS Code zu PyCharm
Ablauf der Interrupt-Verarbeitung im Quellcode
[Linux] Übergang vom Einschalten zum PC-Start
Installieren Sie PostgreSQL aus dem Quellcode unter CentOS
[Python] Fluss vom Web-Scraping zur Datenanalyse
Ich möchte C ++ - Code aus Python-Code erstellen!
Erfahren Sie, wie Sie Bilder aus dem TensorFlow-Code aufblasen
Lesen des Qiskit-Quellcodes ~ Terra: Lesen von der Schaltungserstellung bis zum Hinzufügen von Gates und Messungen
[Python] Lesen des Django-Quellcodes Ansicht ab Null ①
Lassen Sie Code Day74 ab Null "12. Integer to Roman"
[Von Zeit zu Zeit aktualisiert] Überprüfung von Let Code NumPy
Schritte von der Installation von Python 3 bis zur Erstellung einer Django-App
Lassen Sie Code Day68 von vorne beginnen "709. In Kleinbuchstaben"
Änderungen von Python 3.0 zu Python 3.5
Übergang von WSL1 zu WSL2
Erstellen Sie PostgreSQL aus dem Quellcode
Installieren Sie Python von der Quelle
Von der Bearbeitung bis zur Ausführung
Zusammenfassung vom Erstellen von Python 3.4. * Von der Quelle zum Erstellen einer wissenschaftlichen Computerumgebung
AWS Lambda Layers Eine kurze Erklärung von der Erstellung bis zur Verknüpfung
PyArmor ~ Einfache Möglichkeit, Python-Quellcode zu verschlüsseln und bereitzustellen ~