- 233 名前:231 mailto:sage [2009/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で呼び出す・・・これはちょっと無謀かも。
|

|