GRUBから起動するコードをCで書いていたが、ろくに触ったことのないC++に書き換えてみることにした。
OSの力が借りられない(と思う)ので、コンパイルが通らなかったり、リンクできなかったりと大変だったので、とりあえずの解決へいたった道筋をメモしておく。
一応動くようになった、というレベルでしかないので、間違ったことをしているかもしれないし、勝手に思い込んでるだけという可能性も高い。
環境はVM上のUbuntu8.04。 GCC4.2.4(G++)でオブジェクトファイルにコンパイル -> ldでリンクという流れ。
- staticメンバへの参照を解決できない
- staticメンバはクラス定義の外部に実態を作らないといけない
- eh_frameというセクションから何かの関数への参照を解決できない
- eh_frameは例外処理関係のコードが入ってるらしい。
- コンパイルオプションに-fno-exceptionsをつけると例外処理を無効にできる
- 関数static_initialization_and_destructionからcxa_atexitとdso_handleに対する参照が解決できない
- static_init(ry はnew以外で静的に用意したオブジェクトの初期化と後処理のための関数?
- cxa_atexitで終了時に動作するデストラクタを登録している?
- ダミーのcxa_atexitをリンクさせて無理やり解決
- dso_handleはよくわからない。Dynamic Shared Object関係?
- libgcc.aからarコマンドでdso_handle.oを抜き出してリンク。とりあえず動く。
- new演算子への参照が(ry
- new演算子関数というものを定義すれば良いらしい
- new演算子関数はオブジェクトのためのメモリ確保を行う
- オブジェクトのサイズを引数として呼ばれ、確保したメモリのアドレスを返す
- new演算子関数が返したアドレスをthisとしてコンストラクタが呼ばれる
- アセンブラの関数への参照が(ry
- extern "C" としなければいけないらしい
割と問題が山積みな気もするけど、一応動くとこまで持っていけるということで手打ちにする。
0 件のコメント:
コメントを投稿