Wir haben ein großes C++ - Projekt, das wir mit GCC und MSVC erstellen, und wir haben die static initialization order fiasco gefunden. Gibt es eine Möglichkeit, eine Liste von Symbolen zu generieren, die an der statischen Initialisierung teilnehmen, damit ich einen Plan erstellen kann, um das Problem zu lösen?Wie kann ich einfach eine Liste von Symbolen mit statischem Speicher generieren?
Ich habe eine Map-Datei von beiden GCC und MSVC erstellt. Die Ausgabe von MSVC sah nicht sehr nützlich aus. Es scheint, dass die Kartendatei von GCC verwendet werden könnte - ich habe alles extrahiert, was mit dem Abschnitt bss
zusammenhängt. Viele der Symbole stammen jedoch aus Bibliotheken und fügen der Information lediglich Rauschen hinzu.
Gibt es einen Trick oder eine andere bequeme Möglichkeit, die Informationen zu erhalten, die ich suche (kurz, jede Quelldatei manuell zu lesen)?
GCC komplex ist, wegen seiner Wurzeln als „Ersatz-C-Compiler“ - weder ein wahrer C++ Compiler noch ein vollständiger C-Compiler. Insbesondere ist es für einige verschiedene Standard-Bibliotheksimplementierungen (entweder die GNU C-Bibliothek) verantwortlich, die normalerweise mit dem Betriebssystem geliefert werden, und nicht GCC selbst. Als Ergebnis implementiert GCC "main" auf verschiedene Arten und dies beeinflusst auch, wie ctors ausgeführt werden. Siehe auch http://stackoverflow.com/questions/28564078/why-does-gcc-put-calls-to-constructors-of-global-instances-into-different-sectio – MSalters