Kompilieren von C ++ unter Linux ohne die Laufzeitbibliothek

8

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

    
Patrick Samy 21.04.2011, 00:39
quelle

3 Antworten

5

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!

    
Patrick Samy 21.04.2011, 23:39
quelle
1

Wenn Sie bereit sind, einen kleinen (200K) Teil der Installation von gcc zu verwenden, können Sie in libgcc_s verlinken. Dadurch erhalten Sie den gesamten Code, den Sie benötigen, damit Ihr Programm die statische Initialisierung ausführt und main aufruft.

    
Mark B 21.04.2011 02:35
quelle
1

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.

    
MSalters 21.04.2011 09:13
quelle

Tags und Links