Linux上でGCC(v.6.1.1)でコンパイルされた共有C++ライブラリの膨大なサイズの原因を分析します。C++シンボル解析:どの静的初期化を実行するかを決定する方法は?
readelf -sW libfoo.so
は、例えば、__static_initialization_and_destruction_0
と呼ばれる特に大きな機能であることを私に伝えます:
000000000026c420 10272 FUNC LOCAL DEFAULT 12 __static_initialization_and_destruction_0(int, int) [clone .constprop.1774]
私は、リンカマップファイルを生成するためにCXX
フラグに-Wl,-Map,foo.map
を追加しました。 はそのマップファイルの収率で0x000000000026c420
を探して:
.text.startup 0x000000000026c420 0x2825 CMakeFiles/foo.dir/bar.cpp.o
は、だから今、私はbar.cpp
が静的初期化の原因となる翻訳単位であることを知っているが、ファイルは任意のstatic
変数が含まれていないと述べました。しかし、多くのヘッダーが含まれています。
これらの関数で、どの変数が静的に初期化されているかはどうすればわかりますか?あなたのプログラムのコンパイル
_#は_'静的ios_base ::初期__ioinitを定義が含まれます。 –
Viatorus