[Kernel Entwicklung] statische C-Libs mit kompilieren

FR3eZeR

Grünschnabel
Hey Leute,
ich habe gestern begonnen, mich ein wenig mit der Kernel-Entwicklung vertraut zu machen.
Dazu habe ich ein Tutorial dazu gemacht, wie man mit GRUB bootet und dann auf C "umsteigt". Sprich: Erster Kernel-Teil in Assembler und Rest (so weit es geht) in C.

Das funktioniert auch alles super, NUR mein bisheriger C-Coder inlcudiert keine C-Libs. D.h. mein "Hallo Welt" sieht so aus:

Code:
int main() {


  // Pointer zum Videospeicher
  char *video = (char*)0xB8000;
  // String zum Ausgeben
  char *hello = "Hello World 123456";
 
  // Zuerst den Speicher leeren
  for(video+=4000; video !=(char*)0xB8000 ;video--)
     *video=0;
 
  // String ausgeben
  while (*hello) {
    *video = *hello;
    video++;
    *video = 0x07;
    video++;
    hello++;
  }
 
  // jetzt wo wir schon im Kernel drin sind, wollen wir auch nicht mehr raus ;)
  while (1);
  return 0;
}

Nun möchte ich jedoch die stdio.h Lib mit kompilieren, damit ich auf die IO-Funktionen zugreifen kann. Das sollte doch eigentlich mit dem Schalter '-static' vom gcc machbar sein.

Wenn ich das Ding dann kopiliere, wird beim Start der GRUB-Loader geladen und dann mein "OS". Dann jedoch kommt kein Hello World ( printf("Hello World"); ), sondern:

Error 15: File not found.

Ich nehme an, damit ist gemeint, dass #include <stdio.h> nicht gefunden wird.
Woran kann das liegen ? Mit dem Schalter -static wird doch wirklich KOMPLETT ALLES ins binary reinkopiert.
 
Nun möchte ich jedoch die stdio.h Lib mit kompilieren, damit ich auf die IO-Funktionen zugreifen kann. Das sollte doch eigentlich mit dem Schalter '-static' vom gcc machbar sein.
Nein. Du kannst nicht so ohne weiteres die Standardbibliothek eines anderen Systems für dein eigenes verwenden. Die musst du dir schon selber schreiben.

Wenn ich das Ding dann kopiliere, wird beim Start der GRUB-Loader geladen und dann mein "OS". Dann jedoch kommt kein Hello World ( printf("Hello World"); ), sondern:

Error 15: File not found.

Ich nehme an, damit ist gemeint, dass #include <stdio.h> nicht gefunden wird.
Wenn du das vermutest, solltest du dich vielleicht erst mal mit den Grundlagen beschäftigen, bevor du dich daran machst, einen Kernel zu entwickeln. #include ist ein Präprozessor-Makro. Diese werden noch vor der eigentlichen Übersetzung des Programms interpretiert und nicht zur Laufzeit.

Woran kann das liegen ? Mit dem Schalter -static wird doch wirklich KOMPLETT ALLES ins binary reinkopiert.
Hier bin ich mir nicht ganz sicher, aber meine Erklärung wäre die folgende: Das liegt daran, dass Bibliotheken, die statisch gelinkt wurden, selber dynamisch gegen weitere Bibliotheken gelinkt sein können. Und vermutlich wird genau eine solche dynamisch gelinkte Bibliothek bei der Ausführung deines Kernels gesucht.

Die Lösung lautet in jedem Fall: selber schreiben.

Grüße, Matthias
 
Zurück