FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

ISSでアドレス逆サーチとブレークポイントの導入(1)

LuaとBfdのインタフェースが出来たので、これを利用していろんなことができる。

Luaインタフェースで、関数のシンボルからエントリポイントを探索する。

Luaで次のようなインタフェースを実装した。

get_addr (cpu, symbol)

インスタンスCPUに対して、関数のエントリポイントsymbolを探索する。 例えば、

get_addr (cpu, "main")

とすると、main関数のアドレス位置を返す。

実装

Luaインタフェースでこの関数が呼ばれたときは、関数ヘッダ位置のリストを探索し、該当するエントリポイントが見つかると、そのアドレスを返す。

int Lua_GetAddr (lua_State *L)
{
    // Getting Arguments
#ifdef ARCH_MIPS
    MipsEnv *env = static_cast<MipsEnv *>(lua_touserdata (L, 1));
#else  // ARCH_MIPS
#ifdef ARCH_RISCV
    RiscvEnv *env = static_cast<RiscvEnv *>(lua_touserdata (L, 1));
#endif // ARCH_RISCV
#endif // ARCH_MIPS

    std::string symbol = lua_tostring (L, 2);
    Addr_t addr;
    if (env->FindFuncAddr (&addr, symbol) == true) {
        lua_pushinteger (L, addr);
    } else if (env->FindGVarAddr (&addr, symbol) == true) {
        lua_pushinteger (L, addr);
    } else {
        lua_pushinteger (L, -1);
    }

    return 1;
}


...

bool EnvBase::FindFuncAddr (Addr_t *addr, std::string symbol)
{
    FunctionTable::iterator it = m_func_table->begin ();
    while (it != m_func_table->end ()) {
        if ((*it)->symbol == symbol) {
            *addr = (*it)->addr;
            return true;
        }
        it++;
    }
    return false;
}

以下のようにLuaスクリプトを構成しておく。

mips = make_core ("mips")
print(string.format("Function Addr = %08x\n", get_addr (mips, "main")))
run (mips)

以下のように、mainのアドレスを取得することができる。

Function Addr = 80002254