c – 静的記憶域を使ってシンボルのリストを簡単に生成する方法を教えてください。

GCCとMSVCの両方を使用して構築している大規模なCプロジェクトがあり、static initialization order fiascoに遭遇しました。静的初期化に参加するシンボルのリストを生成する方法はありますか。問題?

GCCとMSVCの両方からマップファイルを作成しました。 MSVCの出力はあまり役に立ちませんでした。 GCCのマップファイルを使うことができるようです – 私はbssセクションに関連するすべてを抽出しました。しかし、シンボルの多くはライブラリから来ており、情報にノイズを加えるだけです。

探している情報を入手するためのトリックやその他の便利な方法はありますか(手動ですべてのソースファイルを読むのではありません)

ベストアンサー
Visual Cの場合:.mapファイルの行を並べ替えます。これにより、シンボルはアドレス順に並べられます。

シンボル__xc_aと__xc_zを検索します。これら2つのシンボルの間に現れるシンボルは、静的記憶期間を持つオブジェクトのすべての動的初期化子です。初期化子はリストに現れる順番で実行されます。

.mapファイルの各エントリには、両方が含まれています。

>グローバル変数の名前(例えば、グローバル変数fredのイニシャライザは、fred $ initializer $に加えて必要なCの名前修飾を加えたもの)
>グローバル変数を含むオブジェクトファイル(例:fred.obj)。シンボルが静的ライブラリからのものである場合は、静的ライブラリがリストされます(例:libfred:fred.obj)。

(GCCが自分のツールを使ってこれを実行する方法に答えるのに十分なことはわかりません。)

転載記事の出典を記入してください: c – 静的記憶域を使ってシンボルのリストを簡単に生成する方法を教えてください。 - コードログ