2017-01-15 5 views
0

J'écris un noyau C++ pour mon propre système d'exploitation hobby. Je travaille sur un mac, et compilé un compilateur croisé de travail (jusqu'à maintenant) à partir de la version 4.8.2 de gcc.Le lieur ne parvient pas à trouver les bibliothèques standard

Actuellement, j'ai un fichier kernel.cpp, contenant seulement une fonction main() et quand je compile et lier seulement ce fichier, tout fonctionne très bien. Cependant, quand j'ajoute une classe, dans un autre fichier, l'éditeur de liens commence à se plaindre:

/opt/cross/gcc-i686-elf/lib/gcc/i686-elf/4.8.2/../../../../i686-elf/bin/ld: cannot find -lstdc++ 
/opt/cross/gcc-i686-elf/lib/gcc/i686-elf/4.8.2/../../../../i686-elf/bin/ld: cannot find -lm 
/opt/cross/gcc-i686-elf/lib/gcc/i686-elf/4.8.2/../../../../i686-elf/bin/ld: cannot find -lc 
/opt/cross/gcc-i686-elf/lib/gcc/i686-elf/4.8.2/../../../../i686-elf/bin/ld: cannot find -lc 

Je trouve que ce sont toutes les bibliothèques standard manquantes, non?

Un détail intéressant est que lorsque j'ajoute la même classe au kernel.cpp au lieu d'un nouveau fichier, cela fonctionne comme un charme.

Quelqu'un peut-il m'aider avec où je devrais trouver ces bibliothèques, et comment je peux les obtenir si elles ne sont pas disponibles? Devraient-ils venir avec le compilateur croisé ou devraient-ils déjà être disponibles sur mon macOS?

Voilà comment je construis mon code:

i686-elf-g++ -Wall -ffreestanding -m32 vga/vga.cpp kernel.cpp -o kernel.bin 

Toute aide est la bienvenue, merci!

Répondre

1

Si vous écrivez votre propre noyau, vous êtes seul, c'est un peu le point. Vous devrez écrire des appels système avant de pouvoir écrire (ou porter) une bibliothèque standard.

Ajoutez un indicateur -ffreestanding pour indiquer au compilateur que vous n'avez pas de bibliothèque standard.

Edit: ajouter -nostdlib dire l'éditeur de liens que vous ne disposez pas d'une bibliothèque standard et -lgcc comme compilateur pourrait faire des appels à libgcc (cette bibliothèque est fournie par votre compilateur croisé). -m32 est inutile car votre compilateur croisé est fait avec une cible de 32 bits

+0

Merci Sjur, je savais que j'étais seul. Je passe déjà le drapeau --ffreestanding au compilateur. J'ai mis à jour la question avec les commandes que j'exécute pour construire et lier le code. – Pieter

+0

[Trouvé comme wiki osdev.] (Http://wiki.osdev.org/Why_do_I_need_a_Cross_Compiler%3F#Options_that_you_should_pass_to_your_Compiler) Vous devez également ajouter -nostdlib et -lgcc. –

+0

Merci, -nostdlib a fait l'affaire! Merci également d'avoir signalé cette page sur OSDev. J'ai vu beaucoup de leurs pages dans la recherche d'une réponse, mais je n'ai pas trouvé celui-ci. – Pieter