09/12/08 09:58:02
あー、すまん。wikiに4.0対応版がアップされてるのね・・・
しかしソース読んでみたが、IModuleVtbl::CreateInstanceで展開して本体のCreateInstanceに
繋いでるな。これ使っちゃうとグローバル変数駄目かもしれない。
BREWがグローバル変数使えなかったのはmodのローダ(OSの処理)がアドレスのリロケーション
を行わないから・・・だったはず。で、elf2modが自前でリロケーション行う処理を追加してmod吐く。
なんだけどこのリロケーション処理、AEEMod_Loadの前に連結されてるはず(その分AEEMod_Load
本体のアドレスがずれる)。modバイナリでいうと0x08~か?
で、直にCreateInstanceへ飛んじゃうとこのリロケーション処理行われないままだから、グローバル変数
へアクセスすると落ちる。リロケーション前だと多分、プログラムコード部分(かもっと前)と被ってる。
3.1版では展開用のAEEMod_Loadが呼び出すのは展開されたmodのオフセット0x08(ModuleProxy.cppsの175行)、
つまりリロケーション処理のコード。だからグローバル変数が使えてる。
・・・と予想してみた。
4.0でグローバル変数使うためには>>232で書いたように、圧縮バイナリを展開プログラムに持たせるしか。
あるいは自力でリロケーションコード書いて、CreateInstanceで呼び出す・・・これはちょっと無謀かも。