6

エミュレーターの一部として、CPU と SaveState の 2 つのモジュール (共有オブジェクト) を作成しました。どちらも独立して .so 個別のファイルにコンパイルされ、require(); を使用して Lua スクリプトによって実行時にロードされます。すなわち:

SaveState = require("SaveState")
CPU = require("CPU")

CPU 内には、SaveState で動作するメソッドがあります。

int CPU::save_state(SaveState *state) {
    state->begin_section(savestate_namespace, savestate_data_size);

    state->write16(this->reg.af);
    state->write16(this->reg.bc);
    state->write16(this->reg.de);
    state->write16(this->reg.hl);
    state->write16(this->reg.sp);
    state->write16(this->reg.pc);
    state->write8 (this->interrupts_enabled);
    state->write8 (this->irq_flags);
    state->write8 (this->ie_flags);
    state->write8 (this->halted);
    state->write8 (this->halt_bug);
    state->write8 (this->extra_cycles);
    state->write64(this->total_cycles);
    state->write64(this->idle_cycles);

    return SaveState::OK;
}

正常にコンパイルされますが、次のrequire("CPU")行は失敗します。

lua5.1: error loading module 'cpu' from file './src/cpu/build/cpu.so':
    ./src/cpu/build/cpu.so: undefined symbol: _ZN9SaveState7write64Ey

を使用するnm -Dと、savestate.so でその正確なシンボルを確認できますが、実行時には何らかの理由で表示されません。

4

1 に答える 1

2

他の 2 つのモジュールよりも前にロードされ、luaopen_module メソッドで dlopen() を呼び出すだけの 3 つ目のモジュールを作成することで、これを解決することができました。

void *res = dlopen("src/savestate/build/savestate.so",
    RTLD_NOW | RTLD_GLOBAL);

これが最善の解決策かどうかはわかりませんが、うまくいくようです。(ハードコードされたパスなどを使用しないように、少し一般化する必要があります...)

于 2013-01-31T02:35:47.137 に答える