Nehmen wir an, mein Userspace (Pakete) wurde mit gcc 4.7
kompiliert und libc6 2.13
(Debian Wheezy)
Kann ich den Linux-Kernel unter einer anderen Entwicklungsumgebung kompilieren, wie z. B. gcc 6.3
und libc6 2.24
(zB unter Debian Stretch) ?
Ich weiß, dass der Kernel im Gegensatz zu Paketen nicht mit dynamischen Bibliotheken verknüpft ist. Theoretisch sollte es also keinen Unterschied machen, welcher gcc
und libc
es wurde kompiliert unter.
Stimmt das?
Könnte ich Probleme bekommen, wenn ich das mache?
Könnte es vielleicht zu Inkompatibilitäten kommen, die durch verschiedene gcc
verursacht werden Versionen?
Andererseits neuere gcc
hat einige interessante Features, bessere Sicherheit. Also sollte der Kernel vielleicht mit dem neusten gcc
kompiliert werden ?
Akzeptierte Antwort:
Wie Sie betonen, hat die verwendete C-Bibliothek keine Auswirkungen auf den Kernel, der Kernel verwendet die C-Bibliothek nicht. (Es gibt eine indirekte Auswirkung, da es zum Erstellen von Tools verwendet wird, die der Kernel während seines Erstellungsprozesses verwendet, aber es ist äußerst unwahrscheinlich, dass dies das Endergebnis beeinflusst.)
Der Kernel kann mit einer Vielzahl unterschiedlicher Compiler-Versionen gebaut werden; Laut seiner Dokumentation benötigt es nur GCC 3.2 oder höher. Sie werden auch feststellen, dass es eine Weile dauern kann, bis der Kernel die neuesten Versionen von GCC offiziell unterstützt, und noch länger, bis ein Distributionskernel ihn verwendet. Zum Beispiel verwendet das Debian-Linux-Kernel-Paket GCC 6 und hat sogar spezielle Pakete, um die richtige Compiler-Version bereitzustellen (linux-compiler-gcc-6-x86
auf amd64
und i386
). Es besteht keine Verbindung zwischen dem für den Kernel verwendeten Compiler und dem für den Userspace verwendeten Compiler (es besteht auch keine Notwendigkeit, denselben Compiler für den gesamten Userspace zu verwenden – alte Programme, die mit GCC 3 oder sogar 2 erstellt wurden, funktionieren immer noch auf modernen Systemen).
Neuere Compiler-Versionen bieten zwar mehr Sicherheitsfunktionen, aber GCC 6 ist gut genug für die meisten, wenn nicht alle im Kernel verwendeten Sicherheitsfunktionen.