Linker, Loader und ausführbare Formate

Welcher Mechanismus lässt in C++ die Konstruktoren globaler Objekte vor main ausführen?

  1. ADie CPU findet die Konstruktoren und führt sie automatisch zuerst aus
  2. BDer Compiler schreibt stets alle Konstruktoren in die erste Zeile der Funktion main
  3. CDie Adressen der Funktionen, die die Konstruktoren aufrufen, werden in Tabellen wie .init_array gesammelt, und der Startcode ruft sie vor main der Reihe nach auf
Antwort und Erläuterung anzeigen

Antwort: C. Die Adressen der Funktionen, die die Konstruktoren aufrufen, werden in Tabellen wie .init_array gesammelt, und der Startcode ruft sie vor main der Reihe nach auf

Der Compiler erzeugt für jede Datei eine Funktion, die die globalen Objekte initialisiert, und legt deren Adresse in der speziellen Section .init_array ab. Der Linker fasst die .init_array aller Dateien zu einer Tabelle zusammen, und Startcode oder dynamischer Linker rufen die Funktionen dieser Tabelle vor main der Reihe nach auf. Verarbeitungen bei der Beendigung werden entsprechend in .fini_array gesammelt. Die Reihenfolge der Initialisierung über Dateigrenzen hinweg ist nicht festgelegt; daher ist darauf zu achten, keine Abhängigkeiten zu erzeugen.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Linker, Loader und ausführbare Formate

  1. Welche Aussage zur vom Compiler aus einer Quelldatei ausgegebenen Objektdatei (.o) ist richtig?
  2. Welche Aussage zur Hauptaufgabe des Linkers ist richtig?
  3. Welche Aussage zur vom Linker durchgeführten Symbolauflösung ist richtig?
  4. Welche Aussage zur vom Linker durchgeführten Relokation ist richtig?
  5. Beim Linken eines C-Programms trat der Fehler „undefined reference to `foo'“ (undefinierte Referenz auf foo) auf. Was ist die wahrscheinlichste Ursache?

Vergleiche zu diesem Thema