Question

Mon GCC natif dit que son triplet est le suivant.

> gcc -dumpmachine
x86_64-suse-linux

Où CPU-VENDOR-OS sont en conséquence x86_64, SUSE, Linux. Ce dernier signifie que les glibs sont utilisés (?). Lorsque je fais du système basé sur BusyBux compilant, le triplet du compilateur est quelque chose comme AVR32-linux-uclibc, où le système d'exploitation est «Linux-Uclibc», ce qui signifie que l'UCLIBC est utilisé.

La différence entre «Linux-Glibc» et «Linux-UCLIBC» est (AFAIU) dans Collect2 Behavior et LiBGCC.A Content. GLIBC ou UCLIBS sont silencieusement liés au binaire cible.

La question est que comment le noyau Linux a-t-il été compilé par les mêmes compilateurs? Dès que le noyau fonctionne sur le bare-metal, il ne doit pas être lié à un type de libc d'espace utilisateur, et doit utiliser un libgcc.a approprié

Était-ce utile?

La solution

GCC a toutes sortes d'options pour contrôler son fonctionnement. Voici quelques-uns pertinents:

  • -nostdlib Pour omettre de lier aux bibliothèques standard et au code de démarrage
  • -nostdinc Pour omettre la recherche de fichiers d'en-tête dans les emplacements standard.
  • -ffreestanding Pour compiler pour un environnement indépendant (comme un noyau)

Vous n'avez pas non plus besoin d'utiliser GCC pour les liens. Vous pouvez invoquer directement le linker, le fournir de votre propre carte de linker, du code d'objet de démarrage et tout ce dont vous avez besoin.

La construction du noyau Linux semble, pour des raisons arbitraires de ne pas utiliser -ffreestanding , il contrôle cependant l'étape de liaison et garantit que le noyau est lié sans tirer dans aucun code d'espace utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top