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前提、リンカを変更する必要がある