| Zeile 26: | Zeile 26: | ||
=== g++ === | === g++ === | ||
| − | <cpp> | + | <syntaxhighlight lang="cpp"> |
// Lizenz: public domain | // Lizenz: public domain | ||
| Zeile 34: | Zeile 34: | ||
// Programm/Kernel beenden | // Programm/Kernel beenden | ||
} | } | ||
| − | </ | + | </syntaxhighlight> |
== globale/statische Objekte == | == globale/statische Objekte == | ||
| Zeile 47: | Zeile 47: | ||
In neueren Version von GCC wurde die Sektion .ctors* in .init_array umbenannt und muss gegebenenfalls im Linkerscript geändert werden. | In neueren Version von GCC wurde die Sektion .ctors* in .init_array umbenannt und muss gegebenenfalls im Linkerscript geändert werden. | ||
| − | <cpp> | + | <syntaxhighlight lang="cpp"> |
// Lizenz: public domain | // Lizenz: public domain | ||
| Zeile 64: | Zeile 64: | ||
(*i)(); | (*i)(); | ||
} | } | ||
| − | </ | + | </syntaxhighlight> |
Diese Funktion muss explizit aufgerufen werden bevor globale/statische Objekte verwendet werden. Dies kann beispielsweise im [[C++#Startup-Code | Startup-Code]] geschehen. | Diese Funktion muss explizit aufgerufen werden bevor globale/statische Objekte verwendet werden. Dies kann beispielsweise im [[C++#Startup-Code | Startup-Code]] geschehen. | ||
| Zeile 76: | Zeile 76: | ||
Im Konstruktor eines globalen/statischen Objekts wird die folgende Funktion aufgerufen: | Im Konstruktor eines globalen/statischen Objekts wird die folgende Funktion aufgerufen: | ||
| − | <cpp> | + | <syntaxhighlight lang="cpp"> |
int __cxa_atexit(void (* f)(void *), void *p, void *d); | int __cxa_atexit(void (* f)(void *), void *p, void *d); | ||
| − | </ | + | </syntaxhighlight> |
f ist ein Funktionszeiger zu einem Destruktor, p der Parameter, der dem Destruktor übergeben werden soll und d ist das sog. "home DSO" (DSO = dynamic shared object). Diese Funktion sollte alle drei Parameter speichern und bei Erfolg 0, andernfalls nicht 0 zurückgeben. Wenn der Kernel/das Programm dann beendet wird, sollte man die Funktion | f ist ein Funktionszeiger zu einem Destruktor, p der Parameter, der dem Destruktor übergeben werden soll und d ist das sog. "home DSO" (DSO = dynamic shared object). Diese Funktion sollte alle drei Parameter speichern und bei Erfolg 0, andernfalls nicht 0 zurückgeben. Wenn der Kernel/das Programm dann beendet wird, sollte man die Funktion | ||
| − | <cpp> | + | <syntaxhighlight lang="cpp"> |
void __cxa_finalize(void *d); | void __cxa_finalize(void *d); | ||
| − | </ | + | </syntaxhighlight> |
mit d = 0 aufrufen, um alle mit __cxa_atexit registrierten Funktionen mit passenden Paramtern aufzurufen. Die registrierten Funktionen müssen in umgekehrter Reihenfolge aufgerugen werden. | mit d = 0 aufrufen, um alle mit __cxa_atexit registrierten Funktionen mit passenden Paramtern aufzurufen. Die registrierten Funktionen müssen in umgekehrter Reihenfolge aufgerugen werden. | ||
Außerdem muss man ein Symbol namens __dso_handle bereitstellen. Es wird allerdings nur die Adresse des Symbols verwendet um ein DSO zu identifizieren und um __cxa_atexit aufzurufen. | Außerdem muss man ein Symbol namens __dso_handle bereitstellen. Es wird allerdings nur die Adresse des Symbols verwendet um ein DSO zu identifizieren und um __cxa_atexit aufzurufen. | ||
| − | <cpp> | + | <syntaxhighlight lang="cpp"> |
// Lizenz: public domain | // Lizenz: public domain | ||
| Zeile 128: | Zeile 128: | ||
} | } | ||
} | } | ||
| − | </ | + | </syntaxhighlight> |
== new/delete == | == new/delete == | ||
| Zeile 139: | Zeile 139: | ||
Eine einfache Implementation ist z.B.: | Eine einfache Implementation ist z.B.: | ||
| − | <cpp> | + | <syntaxhighlight lang="cpp"> |
void *operator new( size_t size ) | void *operator new( size_t size ) | ||
{ | { | ||
| Zeile 159: | Zeile 159: | ||
kfree( obj ); | kfree( obj ); | ||
} | } | ||
| − | </ | + | </syntaxhighlight> |
== RTTI == | == RTTI == | ||