it-swarm.com.de

Warum wird glibc getrennt von GCC gepflegt?

GCC ist der C-Compiler. Glibc ist die C-Bibliothek. Ist es jedoch nicht unbedingt erforderlich, dass ein Compiler und die Standardbibliothek als C-Implementierung gebündelt werden?

Beispielsweise enthält die C-Bibliothek ABI- und Compilerspezifische Elemente wie <limits.h>, <stdint.h> Usw., die sich zwischen Compilern und APIs unterscheiden. Details wie "Aufrufen einer Hauptfunktion" hängen ebenfalls vom Compiler ab. Tatsächlich werden diese Details jedoch von libc.so Auf einem Linux-System bereitgestellt. Wenn ich beispielsweise den Compiler so ändere, dass er mit einem anderen ABI arbeitet, wie z. B. int mit 8 Bytes, funktioniert die C-Bibliothek nicht mehr, da die Inhalte in <limits.h> Falsch werden.

13
Michael Tsang

Einer der Gründe ist, dass [~ # ~] gcc [~ # ~] auf (z. B. proprietären Unix-Systemen wie MacOSX, Solaris, HPUX oder einigen FreeBSD) Systemen aufgebaut und verwendet werden kann, die ihre eigenen haben eigene C Standardbibliothek .

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 erstellen. dietlibc usw. Und ein Linux-System könnte das GNU Glibc) haben und einen anderen C-Compiler verwenden (wie Clang 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) von libc

Und GCC kann als Cross-Compiler erstellt werden.

Details wie "Aufrufen einer main-Funktion" hängen ebenfalls vom Compiler ab. Tatsächlich werden diese Details jedoch von libc.so Auf einem Linux-System bereitgestellt.

Das ist nicht genau richtig. Die Funktion main wird (in einer gehosteten Umgebung) von crt0 aufgerufen, von denen einige von GCC bereitgestellt werden (z. B. /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o Auf meinem Debian/Sid/x86-64) aus dem Paket libgcc-6-dev). Lesen Sie auch über libgcc

Tatsächlich gibt es eine halb verborgene Beziehung zwischen libc und GCC, z. 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 so ändere, dass er mit einem anderen ABI arbeitet ...

Sie müssen ... /configure Den GCC-Compiler neu erstellen und neu erstellen, und möglicherweise müssen Sie sogar den GCC-Compiler patchen ( um Ihren ABI zu beschreiben und Aufrufkonventionen ). Das x32 ABI ist ein gutes Beispiel.

Endlich haben einige Mitwirkende oder Betreuer von GCC (einschließlich mir) eine Copyright-Zuweisung unterzeichnet, die GCC abdeckt, jedoch nicht den GNU glibc.

(Lesen Sie die GCC-Lizenz sorgfältig durch Ausnahme der GCC-Laufzeitbibliothek )

Beachten Sie, dass einige Standardheader wie <limits.h> Oder <stdint.h> Von GCC bereitgestellt werden. andere, wie <stdlib.h>, werden während der GCC-Erstellung "behoben": Die Compiler-Erstellungsprozedur entnimmt sie der Libc-Implementierung und patcht sie. Andere Standard-Header (wahrscheinlich <stdio.h> Und die darin enthaltenen internen Header) werden aus dem libc übernommen. Lesen Sie mehr über GCC FIXINCLUDES und Fixed Header Files .

(Das Problem ist etwas, das ich (Basile) immer noch nicht gut verstehe.)

Sie können mit gcc -v -H Kompilieren, um genauer zu verstehen, welche tatsächlichen Programme ausgeführt werden (da gcc ein Treiber ist und den Compiler cc1, Den ld & collect2 Ausführt Linker, der Assembler as usw.) und welche Header enthalten sind, welche Bibliotheken und Objektdateien verknüpft sind (auch implizit, einschließlich der C-Standardbibliothek und der crt0 ) . Lesen Sie mehr über GCC Optionen .

Übrigens können Sie eine C-Standardbibliothek verwenden, die sich von der unterscheidet, die Ihr GCC erwartet oder für die er erstellt wurde (z. B. musl-libc Oder einige dietlibc ), indem Sie die entsprechenden zusätzlichen Argumente für gcc .. umgehen. .

20