Auf dieser Seite findest du eine Übersicht über typische Standard Linker Sections mit Informationen zur Initialisierung und das Schreibe- und Leseverhalten.
Einige Code-Beispiele zeigen außerdem "Was landet in welcher Linker Section?". Auch wenn man sich typischerweise für "normalen" Code und "normale" Daten nicht um Linker Sections kümmern muss, kann es manchmal (z.B. im Embedded Bereich) sehr hilfreich sein, die Zuordnungen zu kennen. In einigen Fällen kann auch eine bestimmte Festlegung sinnvoll sein, z.B. um bestimmte Daten in ein EEPROM zu legen oder ein vorhandenes SRAM für schnellen Zugriff zu nutzen.
Wenn du weitere nützliche Informationen oder Anmerkungen zu dem Thema hast, würde ich mich sehr über eine Nachricht freuen.
Section Name: | Beschreibung: |
---|---|
.text |
Ausführbarer Programm-Code (executable). |
.data |
Initialisierte Daten (initialized data). |
.rdata |
Ähnliche wie .data section, aber nicht schreibbare Daten (read-only, write-protected). |
.bss |
Uninitialisierte Daten (uninitialized data). |
.ctors |
Statische Konstruktoren (constructors of static objects). |
.dtors |
Statische Destruktoren (destructors of static objects). |
.eeprom |
Auf einigen Systemen für EEPROM Variablen gedacht. |
.noinit |
Auf einigen Systemen für Daten, wird nicht initialisiert. |
Der folgende Code-Ausschnitt zeigt eine Beispiel-Zuordnung für Linker-Sections.
Je nach System und Compiler/Linker können die Daten natürlich anders optimiert und abweichenden Sections zugeordnet werden. Beispielsweise landen konstante Variablen häufig direkt im Programmcode.
Beispiel C-Sourcecode:
#include <stdio.h> #include <stdlib.h> const int g_one = 1; // constant initialized global variable: e.g. section .text/.data/.rdata static int g_two = 2; // initialized global variable: e.g. section .data static int g_three; // un-initialized global variable: e.g. section .bss int main(int argc, char *argv[]) { const int four = 4; // constant initialized local data: e.g. local stack/section .text static int five = 5; // initialized local data: e.g. section .data static int six; // un-initialized local variable: e.g. section .bss int seven; // local variable: e.g. local stack/register char str[] = "MyString"; // constant string: e.g. local stack/section .data // ... g_three = 3; six = 6; seven = 7; printf("g_one: %d\n", g_one); printf("g_two: %d\n", g_two); printf("g_three: %d\n", g_three); printf("four: %d\n", four); printf("five: %d\n", five); printf("six: %d\n", six); printf("seven: %d\n", seven); printf("str: %s\n", str); return 0; }
Beispiel C++ Sourcecode:
#include <MyClass.hpp>
int main() {
MyClass test(); // call constructor of MyClass for initialization of the object
test.SomeFunction();
return 0;
}
In dem obigen Beispiel wird ein Objekt vom Typ "MyClass" mit dem Namen "test" durch Aufruf des "MyClass"-Konstruktors erzeugt. Anschließend wird die Member-Funktion "SomeFunction()" aufgerufen und das Programm beendet.
#include <MyClass.hpp>
static MyClass test(); // static constructor/destructor
int main() {
test.do();
return 0;
}
Das zweite Beispiel macht prinzipiell das Gleiche, allerdings wird der "MyClass"-Konstruktor diesmal ausgeführt, bevor die Programmeintrittsfunktion "main()" aufgerufen wird. Der Konstruktoraufruf wird also nicht innerhalb von "main()" initiiert, sondern vorher von der Laufzeitumgebung. Damit das möglich ist, erzeugt der Compiler eine spezielle .ctor Section (und eine .dtor Section für die Desktruktoren) mit entsprechenden Zeigern auf die statischen Konstruktoren/Desktruktoren.
Fehlt etwas in der Übersicht der Standard Linker Sections? Hast du Anregungen oder einen Fehler gefunden? Schreibe doch einen Kommentar...
Diese Website benutzt Cookies. 🍪 Wenn Sie die Website weiter nutzen, stimmen Sie der Verwendung von Cookies zu. Mehr Infos