J'ai essayé de voir le flux du code source à la création du format d'exécution en utilisant GCC.
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
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.
Il semble que vous puissiez voir les paramètres de configuration lorsque vous avez créé GCC.
/ 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
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
/ 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.
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
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.
-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
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é.)
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