Ich möchte analysieren, was die riesige Größe meiner freigegebenen C++ - Bibliothek verursacht, die von GCC (v.6.1.1) unter Linux kompiliert wird.C++ - Symbolanalyse: Wie ermittelt man, welche statische Initialisierung durchgeführt wird?
readelf -sW libfoo.so
sagt mir, dass besonders große Funktionen genannt __static_initialization_and_destruction_0
, z:
000000000026c420 10272 FUNC LOCAL DEFAULT 12 __static_initialization_and_destruction_0(int, int) [clone .constprop.1774]
I -Wl,-Map,foo.map
-CXX
Flags hinzugefügt, um eine Linker-Map-Datei zu erzeugen. der Suche nach 0x000000000026c420
dass Kartendatei ergibt:
.text.startup 0x000000000026c420 0x2825 CMakeFiles/foo.dir/bar.cpp.o
So, jetzt weiß ich, dass bar.cpp
die Übersetzungseinheit ist, die die statische Initialisierung verursacht, aber die Datei keine static
Variablen enthält. Es enthält jedoch viele Header.
Wie finde ich genau heraus, welche Variablen in diesen Funktionen statisch initialisiert werden?
Sie wahrscheinlich verwenden _ # include _ die 'statische ios_base definiert :: Init __ioinit;'. –
Viatorus