Warum wird glibc getrennt von GCC gepflegt?

13

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 sind?

So enthält beispielsweise die C - Bibliothek ABI und Compiler - spezifische Sachen wie <limits.h>, <stdint.h>usw., welches sich zwischen Compilern und APIs. Und Details wie "Wie man eine Hauptfunktion aufruft" hängen auch vom Compiler ab, aber tatsächlich werden diese Details von libc.soeinem Linux-System geliefert . Wenn ich zum Beispiel den Compiler so ändere, dass er mit einem anderen ABI arbeitet, wie zum Beispiel intmit 8 Bytes, funktioniert die C-Bibliothek nicht mehr, weil die Daten <limits.h>falsch sind.

Michael Tsang
quelle

Antworten:

20

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 mainFunktion aufruft" hängen auch vom Compiler ab, aber tatsächlich werden diese Details von libc.soeinem Linux-System geliefert .

Das ist nicht genau richtig. Die mainFunktion 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.oauf meinem Debian / Sid / x86-64 ist aus dem libgcc-6-devPaket). Lesen Sie auch überlibgcc

Tatsächlich gibt es eine halb verborgene Beziehung zwischen libcund GCC, z. B. weil viele libcHeader (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 ... /configureden 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 gcces sich um einen Treiber handelt, auf dem der cc1Compiler, die ld& collect2Linker, der asAssembler 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-libcoder eine Diät-Bibliothek ), und dabei die entsprechenden zusätzlichen Argumente umgehen, um gcc...

Basile Starynkevitch
quelle
1
Richtige Antwort, auch wenn das Design nicht stimmt. Aus diesem Grund kann MSVC ++ C ++ 11 / C ++ 14-Code für Betriebssysteme vor 2011/2014 kompilieren, GCC jedoch normalerweise nicht.
MSalters
Was meinst du mit "kein korrektes Design"? Und ich bin mir nicht sicher, ob GCC C ++ 14-Code für alte Betriebssysteme nicht kompilieren kann (möglicherweise müssen Sie jedoch ein aktuelles GCC für dieses ältere Betriebssystem kompilieren).
Basile Starynkevitch
Nach ISO C ist die C-Standardbibliothek Bestandteil des Compilers. Gleiches gilt für die C ++ - Bibliothek. Das Problem ist nun, dass Anwendungen, die mit einer neuen GCC-Version erstellt wurden, eine Abhängigkeit von der Glibc des Betriebssystems haben, auf dem sie erstellt wurden. Diese kann neuer sein als die Glibc auf dem Zielsystem. Eine bessere Lösung hätte sich wahrscheinlich auf eine verlassen, gcclibcdie auf Betriebssystembibliotheken aufbaut, jedoch als Teil von GCC und nicht des Betriebssystems versioniert ist.
MSalters
Sind Sie sicher, dass die Standards C11 oder C ++ 14 das Wort "Compiler" erwähnen? AFAIU sprechen sie von "Implementierung" (die nicht einmal eine Software sein könnte)
Basile Starynkevitch
1
Einige Header, wie <stdint.h>oder <limits.h>werden in der Tat von GCC bereitgestellt. Andere Header, wie <stdlib.h>ein aus der C-Bibliothek entnommener und während des GCC-Builds "reparierter".
Basile Starynkevitch
-5

Die kurze Antwort lautet: Wenn die beiden zusammengebündelt würden, würde glibc unter der GPL * lizenziert und wäre daher für proprietäre Projekte völlig ungeeignet. Während das FSF- und GNU-Projekt keine Vorliebe für proprietäre Software hat, erhielt glibc die LGPL-Lizenz als strategische Wahl, um die Einführung von GCC und dem freien Software-Ökosystem voranzutreiben. GCC ist tatsächlich unter der GPL mit einer bestimmten Laufzeitverknüpfungsausnahme lizenziert, da die Situation etwas matschig ist. glibc ist gemäß der LGPL lizenziert, um sinnvolle Situationen mit gemeinsam genutzten Bibliotheken zu ermöglichen.

https://www.gnu.org/licenses/gcc-exception-faq.html

Darüber hinaus verfügt glibc über alle Arten von Shims und anderen Komponenten, um sie an unterschiedliche Betriebssysteme anzupassen, und die Weitergabe als dasselbe Paket wie gcc würde die Dinge ebenfalls chaotisch machen.

* Alternativ könnte GCC unter einer anderen GPL lizenziert werden, obwohl die FSF diesbezügliche Überlegungen im Sinne von "Over My Dead Body" (Über meinen toten Körper) wären.

Whatsisname
quelle
3
Sorry, aber diese Antwort ist meiner Meinung nach falsch. "Bündelung" bedeutet nicht, dass es sich um eine "abgeleitete Arbeit" von GCC im Sinne der GPL handelt. Beispielsweise werden in jeder Linux-Distribution Tonnen von Softwarepaketen mit unterschiedlichen Open-Source-Lizenzen "gebündelt", wobei diese Pakete jedoch nicht gegen die GPL verstoßen.
Doc Brown
Warum sollte das Bündeln von gcc und glibc dazu führen, dass glibc unter der GPL steht? Mein Verständnis war, dass Bündel keine "kombinierte Arbeit" sind, so dass die GPL die Grenze nicht überschreitet. Edit: was Doc Brown sagte :-)
Philip Kendall