2010-03-12 13 views
15

Nach dem Kompilieren von C++ Datei (mit der globalen statischen Objekt) I in nm Ausgabe erhalten diese Funktion:g ++ __static_initialization_and_destruction_0 (int, int) - was ist das

00000000 t _Z41__static_initialization_and_destruction_0ii 

__static_initialization_and_destruction_0(int, int) /* after c++filt */ 

Was ist das? Es ruft __cxa_atexit()

Kann ich Generation dieser Funktion zu deaktivieren (und __cxa_atexit() Aufruf) und setzen alle und Destruktor Anrufe .ctors und .dtors Abschnitte?

+2

g ++ hat eine Befehlszeilenoption "-fno-use-cxa-atexit", aber ich denke nicht, dass das helfen wird. Es sieht so aus, als ob es bewirkt, dass 'atexit()' anstelle von 'cxa_atexit()' verwendet wird. Vielleicht ist die bessere Frage, warum g ++ '_static_initialization_and_destruction_0()' erzeugt, um damit zu beginnen, anstatt Konstruktor- und Destruktoraufrufe in den ELF-Abschnitten '.ctors' und' .dtors zu plazieren. Vermutlich gibt es einen guten Grund dafür. – Void

Antwort

14

Diese doc-Datei scheint ya alles, was Sie sagen wollen, würde über diese Funktionen kennen: http://www.nsnam.org/docs/linker-problems.doc

Von dem, was ich grok kann, gcc eine __static_initialization_and_destruction_0 für jede Übersetzungseinheit erstellt, die statischen Konstruktoren muss aufgerufen werden. Dann platziert es __do_global_ctors_aux in den Abschnitt .ctors, der dann auf jeder Übersetzungseinheit __static_initialization_and_destruction_0 aufruft.

Das Problem scheint jedoch viel komplexer zu sein; gcc muss sich mit einzelnen Objektdateien in einem Archiv befassen, und ich denke, so halten sie den Linker davon ab, diese Aufrufe zu optimieren.