Einer der Gründe ist, dass GCC auf Systemen mit einer eigenen C-Standardbibliothek (z. B. proprietären Unix-Systemen wie MacOSX, Solaris, HPUX oder einigen FreeBSD-Systemen) erstellt und verwendet werden kann .
Selbst unter Linux können Sie eine C-Standardbibliothek haben, die nicht GNU Glibc ist . Insbesondere können Sie GCC auf Linux-Systemen mit musl-libc oder mit Bionic (Android-Systeme) oder mit dietlibc usw. erstellen (oder verwenden). Ein Linux-System könnte GNU Glibc haben und einen anderen C-Compiler (wie Clang) verwenden oder TinyCC).
Außerdem hängt die C-Bibliothek stark vom Linux-Kernel ab. Einige alte Versionen des Kernels erfordern möglicherweise eine bestimmte Art (oder Version) vonlibc
Und GCC kann als Cross-Compiler erstellt werden .
Und Details wie "Wie man eine main
Funktion aufruft" hängen auch vom Compiler ab, aber tatsächlich werden diese Details von libc.so
einem Linux-System geliefert .
Das ist nicht genau richtig. Die main
Funktion wird (in einer gehosteten Umgebung) von dem crt0- Zeug aufgerufen , von dem einige von GCC bereitgestellt werden (z. B. /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o
auf meinem Debian / Sid / x86-64 ist aus dem libgcc-6-dev
Paket). Lesen Sie auch überlibgcc
Tatsächlich gibt es eine halb verborgene Beziehung zwischen libc
und GCC, z. B. weil viele libc
Header (optional) einige GCC-Builtins oder Funktionsattribute verwenden .
(Daher müssen die GCC-Entwickler und die GNU libc-Entwickler interagieren.)
.... wenn ich den Compiler ändere um mit einem anderen ABI zu arbeiten ...
Sie müssen ... /configure
den GCC-Compiler installieren und neu erstellen, und möglicherweise müssen Sie sogar den GCC-Compiler patchen (um Ihre ABI- und Aufrufkonventionen zu beschreiben ). Das x32 ABI ist ein gutes Beispiel.
Endlich haben einige Mitwirkende oder Betreuer von GCC (einschließlich mir) eine Urheberrechtserklärung unterschrieben, die GCC, aber nicht die GNU abdeckt glibc
.
(In Bezug auf die GCC-Lizenz lesen Sie die Ausnahme der GCC-Laufzeitbibliothek sorgfältig durch. )
Beachten Sie, dass einige Standardheader wie <limits.h>
oder <stdint.h>
von GCC bereitgestellt werden. andere, wie zum Beispiel, <stdlib.h>
werden während der GCC-Erstellung "behoben": Die Compiler-Erstellungsprozedur nimmt sie aus der Libc-Implementierung und korrigiert sie. Andere Standardheader (wahrscheinlich <stdio.h>
und die darin enthaltenen internen Header) stammen aus dem libc
. Lesen Sie mehr über GCC FIXINCLUDES und Fixed Header Files .
(Die Sache mit dem Fix beinhaltet etwas, das ich (Basile) immer noch nicht gut verstehe.)
Sie könnten mit kompilieren gcc -v -H
, um genauer zu verstehen, welche tatsächlichen Programme ausgeführt werden (da gcc
es sich um einen Treiber handelt, auf dem der cc1
Compiler, die ld
& collect2
Linker, der as
Assembler usw. ausgeführt werden) und welche Header enthalten sind, welche Bibliotheken und Objektdateien verknüpft sind (gerade) implizit, einschließlich der C-Standardbibliothek und der crt0 ). Weitere Informationen zu GCC- Optionen .
Übrigens können Sie eine C-Standardbibliothek verwenden, die sich von derjenigen unterscheidet, die Ihr GCC erwartet oder für die sie erstellt wurde (z. B. musl-libc
oder eine Diät-Bibliothek ), und dabei die entsprechenden zusätzlichen Argumente umgehen, um gcc
...