Ich habe kürzlich damit begonnen, zu untersuchen, wie die C ++ - Laufzeitbibliothek vom generierten Code verwendet wird.
Meistens bin ich sehr neugierig, aber ich möchte auch die Menge an Arbeit bewerten, die benötigt wird, um das minimal erforderliche Zeug zu entwickeln, um einen Kernel in C ++ zu starten.
Also habe ich angefangen, meine eigene Laufzeitbibliothek zu implementieren, aber ich habe ein kleines Problem.
%Vor%Kompilieren Sie dies mit dem folgenden Befehl:
$ g ++ -freestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions -c main.cpp
Ich bekomme diese Warnung:
/ usr / bin / ld: Warnung: Eintragssymbol kann nicht gefunden werden _start; Standard ist 00000000080480b8
Wenn ich dann versuche, das erzeugte Binary auszuführen, bekomme ich einen "Segmentierungsfehler". Ich habe versucht, "main.cpp" und eine ASM-Datei zu kompilieren.
%Vor%Wenn ich die Objektdateien manuell mit "ld" verknüpfe, habe ich keine Warnung, aber die Binärdatei erzeugt immer noch einen "Segmentierungsfehler".
Ich nehme an, ich vermisse etwas. Wahrscheinlich etwas, was vor und nach dem Aufruf von "main" zu tun ist, wie es die System-C-Bibliothek beispielsweise in "__libc_start_main" tut.
Wenn jemand eine Empfehlung von Websites, Dokumentation oder Büchern zu diesem Thema hat, die ich lesen sollte, würde ich das sehr schätzen.
Danke,
Patrick
Okay, dank QuantumMechanics Link habe ich das Problem gefunden: Ссылка
Ich habe gerade meine Grundlagen in der Linux-Programmierung vergessen, wichtiger noch, wie das Programmende gehandhabt wird.
Grundsätzlich musste ich den syscall interrupt "exit" erzeugen, um das Ende des Programms zu behandeln.
%Vor%Nun kann ich jedes C ++ Programm unter Linux mit meiner eigenen RTL kompilieren, um einige Tests durchzuführen.
Beachten Sie, dass es im Kernel nicht benötigt wird, wenn das Ende der Hauptfunktion nie erreicht wird.
Danke!
Wenn Sie einen Kernel erstellen, müssen Sie überlegen, wie er startet. Normalerweise liegt das in der Verantwortung des Bootloaders und sie sind weit entfernt vom Standard. Es ist sicherlich anders als Linux-Apps zu starten. Daher ist es nicht wirklich sinnvoll, sich um _start
zu kümmern, wenn Sie diese Art des Startens sowieso ignorieren.