monalibc 初期化問題 crt周り
今回の問題の対応方法のまとめ。
- weakシンボルを利用する
- [詳細] monalibcがリンクされているときだけ crt(monapi)において init_libcを呼ぶ
- [コード]if (init_libc) { init_libc(); }
- [メリット] monapiがmonalibcに依存しない(init_libc/fini_libcがweak)
- [デメリット] 最新のgccを利用する必要がある
- attribute constructorを利用する
- [詳細] init_libc に constructor attributeをつけてビルドするとmainよりも先に呼び出してくれる
- [メリット] リンクするだけで自動で呼び出される
- [デメリット]呼び出し順序を制御できない。静的クラスのコンストラクタの方が先に呼ばれる
- 起動時ではなく必要なときに初期化を行うようにする
- [詳細]libc関数内(例えばfread)で stdin を参照したら stdin を初期化する的な。
- [メリット]必要なときに初期化するので起動時の初期化が不要
- [デメリット]使用時に毎回チェックはコストが高い?
- DLLのエントリポイントを利用する
- [詳細] DLLのエントリポイントのなかで初期化処理を呼ぶ
- [メリット]リンクされたときだけ走る。
- [デメリット] DLL前提、リンカを変更する必要がある