共有オブジェクト

あまりに何度も共有オブジェクト話を見るので自分でやってみた。とりあえずこれ。

http://shinh.skr.jp/d/so_bogoyaml.tar.bz2

中身の mk を実行したらコンパイルするはず。で、 LD_LIBRARY_PATH=. ./main などとして実行すると test.dump.yml ができていれば成功。

test_bogoyaml.d と bogoyaml.d は適当に YAML をパースしたりダンプしたりする。

maind.d でダミーの D の main 作っておく。これがないと定義されないシンボルがあるため。 libphobos.a の main はたぶん .gnu.linkonce セクションに置いてあるため、別に追い出す必要はなかった。

main.c は Windows で WinMain を動かす時と同様に、自前で GC の初期化をしてから、 D 言語で書かれている void test_bogoyaml(); を呼び出す。ついでになんかリンク時にシンボルが足りないと言われる _d_throw を定義しておく。これは多分 DMD 付属の libphobos.a 内にある _d_throw が _d_throw@4 になっているから。こんな感じ。

void test_bogoyaml();

void _d_throw(void* o) {}

void gc_init();
void gc_term();
//void _minit();
void _moduleCtor();
void _moduleUnitTests();

int main() {
    gc_init();          // ガベージコレクタ初期化
//    _minit();           // モジュールコンストラクタテーブル初期化

    _moduleCtor();      // モジュールコンストラクタ呼び出し
    _moduleUnitTests(); // 単体テスト実行 (オプション)

    test_bogoyaml();

    gc_term();          // ファイナライザの実行、ガベージコレクタ終了

    return 0;
}

なんか _minit は見あたらなかったので使わなかったけどとりあえず動いているみたい。

例外もマジメにやればなんとでもなるはず。説明はしょりすぎな気もします。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h