Compiler wie GCC und Clang ermöglichen das Kompilieren von C ++ - Programmen ohne die C ++ - Standardbibliothek, z. Verwenden des Befehlszeilenbefehls -nostdlib
. Es scheint so, als ob solche Verbindungen dich oft nicht verbinden, zum Beispiel:
In der Regel wird die Verknüpfung aufgrund nicht definierter Symbole wie __cxa_allocate_exception
, typeinfo for int
, __cxa_throw
, __gxx_personality_v0
, __clang_call_terminate
, __cxa_begin_catch
, std::terminate()
usw. nicht hergestellt.
Sogar ein einfaches
%Vor%Fehler beim Verknüpfen mit
ld: warning: Eintragssymbol% co_de% kann nicht gefunden werden; standardmäßig 0000000000400120
und wird vom Betriebssystem bei der Ausführung getötet. Mit _start
führt der Compiler immer noch den Linker aus, der eklatant scheitert mit:
ld: Fehler in
-c
(mytest
); Es wird keine Tabelle.eh_frame
erstellt.
Ist es ein realistisches Ziel, C ++ - Anwendungen oder -Bibliotheken zu programmieren und zu kompilieren, ohne die Standardbibliothek zu verwenden und mit ihr zu verknüpfen? Wie kann ich meinen Code mit GCC oder Clang unter Linux kompilieren? Welche Kernsprachenfunktionen könnte man ohne die Standardbibliothek nicht nutzen?
"Standard" ist eine falsche Bezeichnung. In diesem Kontext bedeutet es nicht "die Bibliothek (Menge von Funktionen, Klassen usw.) wie durch den C ++ Standard definiert", sondern "die übliche Menge von Bibliotheken und Objekten (kompilierte Dateien in einem bestimmten Format), mit denen gcc standardmäßig verlinkt ist". Einige davon sind notwendig, damit die meisten oder sogar alle Programme funktionieren.
Wenn Sie dieses Flag verwenden, liegt es in Ihrer Verantwortung, fehlende Funktionen bereitzustellen. Es gibt mehrere Möglichkeiten, dies zu tun:
Compiler wie GCC und Clang ermöglichen das Kompilieren von C ++ - Programmen ohne die C ++ - Standardbibliothek, z. Verwenden des Befehlszeilenbefehls -nostdlib
. Es scheint so, als ob solche Verbindungen dich oft nicht verbinden, zum Beispiel:
In der Regel wird die Verknüpfung aufgrund nicht definierter Symbole wie crti.o
, crtbegin.o
, crtend.o
, crtn.o
, crti.o
, crtend.o
, crtbegin.o
usw. nicht hergestellt.
Sogar ein einfaches
%Vor%Fehler beim Verknüpfen mit
ld: warning: Eintragssymbol% co_de% kann nicht gefunden werden; standardmäßig 0000000000400120
und wird vom Betriebssystem bei der Ausführung getötet. Mit crtend.o
führt der Compiler immer noch den Linker aus, der eklatant scheitert mit:
ld: Fehler in
-print-file-name=
(.init
); Es wird keine Tabelle.fini
erstellt.
Ist es ein realistisches Ziel, C ++ - Anwendungen oder -Bibliotheken zu programmieren und zu kompilieren, ohne die Standardbibliothek zu verwenden und mit ihr zu verknüpfen? Wie kann ich meinen Code mit GCC oder Clang unter Linux kompilieren? Welche Kernsprachenfunktionen könnte man ohne die Standardbibliothek nicht nutzen?
Sie werden im Prinzip alle Ihre Fragen auf osdev.org finden, aber ich gebe trotzdem eine kurze Zusammenfassung.
Wenn Sie GCC crtbegin.o
angeben, sagen Sie "keine Startup- oder Bibliotheksdateien ". Dies beinhaltet:
crtend.o
, libgcc
, -lgcc
und -nostdlib
. Im Allgemeinen kümmern sich Kernel-Entwickler nur darum, libstdc++
und -fno-rtti
zu implementieren und GCC liefert -fno-exceptions
und %code% , indem sie %code% an den Linker übergeben. Im Allgemeinen sind dies nur Stubs, die aus %code% und %code% bestehen, was Platz für GCC lässt, um den Inhalt von %code% bzw. %code% zu verschieben. Diese Dateien sind für den Aufruf globaler Konstruktoren / Destruktoren erforderlich. Da Sie nur die "Standard-Bibliothek" loswerden wollen, aber libc (auf einem Linux-System) beibehalten, programmieren Sie im Wesentlichen C ++ mit nur einer C-Bibliothek. Natürlich ist nichts falsch daran und du tust es, aber letztlich sehe ich den Punkt nicht, außer du planst die Entwicklung eines Kernels.
Pflichtlektüre:
OSDevs C ++ Seite - Wenn Sie sich wirklich um RTTI / Exception Support kümmern, ist es ärgerlicher zu implementieren als es klingt . In der Regel übergeben Personen einfach %code% oder %code% und machen sich dann Gedanken darüber oder gar nicht.
"Standard" ist eine falsche Bezeichnung. In diesem Kontext bedeutet es nicht "die Bibliothek (Menge von Funktionen, Klassen usw.) wie durch den C ++ Standard definiert", sondern "die übliche Menge von Bibliotheken und Objekten (kompilierte Dateien in einem bestimmten Format), mit denen gcc standardmäßig verlinkt ist". Einige davon sind notwendig, damit die meisten oder sogar alle Programme funktionieren.
Wenn Sie dieses Flag verwenden, liegt es in Ihrer Verantwortung, fehlende Funktionen bereitzustellen. Es gibt mehrere Möglichkeiten, dies zu tun: