Frage

Meine Heimat GCC sagt, dass sein Triplett das folgende ist.

> gcc -dumpmachine
x86_64-suse-linux

Wobei CPU-Vendor-Os entsprechend x86_64, Suse, Linux sind. Letzteres bedeutet, dass Glibs verwendet werden (?). Wenn ich ein Cross-Compiling-Busybux-basiertes System mache, ist das Compiler-Triplett so etwas wie AVR32-Linux-eclibc, wobei OS 'Linux-eclibc' ist, was bedeutet, dass UCLIBC verwendet wird.

Der Unterschied zwischen 'Linux-Glibc' und 'Linux-eclibc' beträgt (AFAIU) in Collect2-Verhalten und libgcc.a-Inhalt. Entweder GLIBC oder UCLIBS sind stillschweigend mit dem Ziel binären verbunden.

Die Fragen sind, wie der Linux -Kernel von denselben Compilern zusammengestellt wurde? Sobald der Kernel auf nacktem Metal läuft, darf er nicht mit einer Art von Benutzer-Raum-LIBC verknüpft worden sein und sollte entsprechend Libgcc verwenden.

War es hilfreich?

Lösung

GCC verfügt über alle Arten von Optionen, um zu steuern, wie es funktioniert. Hier sind ein paar relevante:

  • -nostdlib Um die Verknüpfung mit den Standardbibliotheken und dem Startcode auszulassen
  • -nostdinc Um die Header -Dateien in den Standardstandorten zu unterlassen.
  • -ffreestanding Für eine freistehende Umgebung (z. B. einen Kernel) zusammenstellen

Sie müssen auch nicht GCC zum Verknüpfen verwenden. Sie können den Linker direkt aufrufen, ihn mit Ihrer eigenen Linker -Karte, Ihrem Start -Object -Code und allem anderen zur Verfügung stellen, was Sie benötigen.

Der Linux -Kernelbau scheint aus willkürlichen Gründen nicht zu verwenden -ffreestanding Es steuert jedoch die Verknüpfungsstufe und stellt sicher, dass der Kernel ohne einen Benutzerspace -Code verknüpft wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top