Cでmainの前に関数を呼び出す
セクション.CRT$XIUに関数ポインタを置く。これは自分で書く。
1 2 3 4 5 6 7 8 9 10 |
int cpremain(void) { OutputDebugStringA("cpremain\n"); return 0; } typedef int cb(void); #pragma data_seg(".CRT$XIU") static cb *autostart[] = { cpremain }; #pragma data_seg() |
CRTはCRT$XIAとCRT$XZに__xi_a,__xi_zを置く。
セクションはリンク時にまとめてアルファベット順に並べられるので、__xi_aと__xi_zに挟まれた領域にある関数ポインタを全部呼び出すことでコンストラクタを呼び出す。
C++でグローバルなインスタンスのコンストラクタコール
グローバルインスタンスのコンストラクタを誰が呼ぶか?
Visual C++コンパイラはコンストラクタのポインタをセクションのCRT$XCUに置く。
CRTはCRT$XCAとCRT$XCZに__xc_a,__cx_zを置く。
mainの後に実行するもの
C++のグローバルインスタンスのデストラクタはおそらくatexitの機能と同様に呼ばれる。グローバルな場合はインスタンスが置かれてる順番で登録されるが複数ファイルにまたがるときの順番は不明。staticの場合はコンストラクタが実行された後のタイミングで登録される。
上で示したセグメントでやる呼ぶ方法もあるが同じなのでスルー
https://msdn.microsoft.com/ja-jp/library/bb918180.aspx
http://www.codeguru.com/cpp/misc/misc/applicationcontrol/article.php/c6945/Running-Code-Before-and-After-Main.htm#page-1