[LINUX] Flux du code source à la création du format d'exécution

Aperçu

J'ai essayé de voir le flux du code source à la création du format d'exécution en utilisant GCC.

environnement

x86_64 centos7 gcc4.8.3

helloWorld

include <stdio.h>

int main(){
    printf("Hello world!!");
}

GCC Essayez de compiler

 gcc hello.c -Wall -v
 J'utilise la spécification intégrée.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.3/lto-wrapper
 Cible: x86_64-redhat-linux
 configurer les paramètres: ../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-checking = release --with-system-zlib --enable -__ cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique -object --enable-linker-build-id --with-linker-hash-style = gnu --enable-languages = 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-indirect-function --with-tune = generic --with-arch_32 = x86-64 --build = x86_64-redhat-linux
 Modèle de fil: 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
 Ignorer le répertoire inexistant "/usr/lib/gcc/x86_64-redhat-linux/4.8.3/include-fixed"
 Ignorer le répertoire inexistant "/usr/lib/gcc/x86_64-redhat-linux/4.8.3/../../../../x86_64-redhat-linux/include"
# La recherche de include "..." commence ici:
# La recherche de include <...> commence ici:
 /usr/lib/gcc/x86_64-redhat-linux/4.8.3/include
 /usr/local/include
 /usr/include
 La fin de la liste de recherche.
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
 hello.c: Dans la fonction «main»:
 bonjour.c: 5: 1: AVERTISSEMENT: Contrôle atteint la fin de la fonction non-void [-Wreturn-type]
 }
 ^
COLLECT_GCC_OPTIONS='-Wall' '-v' '-mtune=generic' '-march=x86-64'
 as -v --64 -o /tmp/ccYhWWtz.o /tmp/ccyCCZPY.s
 Utilisez l'assembleur GNU 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

Spécifications intégrées

Qu'est-ce qu'une spécification intégrée

A specs file is plain text used to control the default behavior for the "gcc" front-end.

Il semble que vous puissiez généralement le prendre à l'intérieur et l'écraser si vous le sortez. Ça ressemble à ça.

COLLECT_LTO_WRAPPER C'est un plug-in utilisé par GCC, et semble être utilisé en interne pour rendre le travail plus efficace.

configurer les paramètres:

Il semble que vous puissiez voir les paramètres de configuration lorsque vous avez créé GCC.

compiler

/ usr / libexec / gcc / x86_64-redhat-linux / 4.8.3 / cc1 est le compilateur actuel. L'assembleur compilé est envoyé vers / tmp / ccyCCZPY.s spécifié par -o.

 /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

assembleur

Fichier objet / tmp / ccYhWWtz.o avec le fichier assembleur / tmp / ccyCCZPY.s sortie par compilation comme valeur d'entrée Est sortie.

as -v --64 -o /tmp/ccYhWWtz.o /tmp/ccyCCZPY.s

éditeur de liens

/ usr / libexec / gcc / x86_64-redhat-linux / 4.8.3 / collect2 est le véritable éditeur de liens. Créez un format exécutable en liant le fichier objet assemblé / tmp / ccYhWWtz.o avec divers objets.

Désignation de l'éditeur de liens dynamique

GCC lie dynamiquement les bibliothèques partagées, sauf indication contraire. Par conséquent, l'éditeur de liens dynamique qui se lie lorsque le programme est exécuté est spécifié. Si -static est spécifié, la bibliothèque partagée sera également liée statiquement. Lien dynamique → Dynamic linker -dynamic-linker /lib64/ld-linux-x86-64.so.2

Celui qui lie implicitement

Ceux ci-dessous sont appelés avant le principal de C pour préparer diverses choses, et sont appelés avant la fin du programme pour nettoyer. Cela devrait normalement être lié statiquement.

  1. crtn.o
  2. crtend.o
  3. crtbegin.o
  4. crti.o
  5. crt1.o
Lier d'autres bibliothèques

-l Extrayez xxx après -l et liez libxxx.so pour le lien dynamique et libxxx.a pour le lien statique. Même dans le cas d'un lien dynamique, s'il n'y en a pas, il semble chercher .a. Cette fois, xxx est un lien dynamique avec c, donc liez libc.so (bibliothèque C standard) J'ai l'impression de l'avoir fait. (Doit être lié dynamiquement)

ldd a.out 
    linux-gate.so.1 =>  (0xb776e000)
    libc.so.6 => /lib/libc.so.6 (0x49cbd000)
    /lib/ld-linux.so.2 (0x49c95000)

-L Spécifiez l'emplacement de recherche de la bibliothèque

Résumé

Le compilateur crée les formats d'exécution dans l'ordre suivant. (Hmm, il semble que le préprocesseur ne soit pas spécifié.)

  1. Pré-processus
  2. Compilez
  3. Assemblez
  4. Lien

GCC fait beaucoup de travail en interne. La substance au sens étroit du compilateur est cc1. Cependant, faire le lien est également appelé compilation et construction. Vous pouvez voir que divers objets sont liés simplement en compilant C, qui est juste helloworld.

Recommended Posts

Flux du code source à la création du format d'exécution
Installer ansible à partir du code source
J'ai créé un package pour créer un fichier exécutable à partir du code source Hy
Migrer de VS Code vers PyCharm
Flux de traitement d'interruption vu dans le code source
[Linux] Flux de la mise sous tension au démarrage du PC
Installez PostgreSQL à partir du code source sur CentOS
[Python] Flux du scraping Web à l'analyse des données
Je veux créer du code C ++ à partir de code Python!
Apprenez à gonfler des images à partir du code TensorFlow
Lecture du code source Qiskit ~ Terra: lecture de la création du circuit à l'ajout de portes et de mesures
[Python] Lecture du code source Django Vue à partir de zéro ①
Soit Code Day74 à partir de zéro "12. Integer to Roman"
[Mis à jour de temps en temps] Examen de Let Code NumPy
Étapes de l'installation de Python 3 à la création d'une application Django
Soit Code Day68 à partir de zéro "709. To Lower Case"
Changements de Python 3.0 à Python 3.5
Transition de WSL1 à WSL2
Construire PostgreSQL à partir des sources
Installer Python à partir de la source
De l'édition à l'exécution
Résumé de la construction de Python 3.4. * De la source à la création d'un environnement informatique scientifique
Couches AWS Lambda Une explication rapide de la création à la liaison
PyArmor ~ Un moyen facile de chiffrer et de fournir du code source Python ~