1

私が解決しようとしている問題は、対応するメンバー関数ポインターにマップされた関数名のリストを作成することです。

nmコマンドを使用して.soファイルから直接関数ポインターを取得し、関数ポインターを介してそれらを呼び出そうとしましたが、正常に実行できませんでした。

.soファイル内:

0xd52=>DerivedModel::DoSomething()
0xd94=>DerivedModel::checkReference()

オフセットは0x42です。

しかし、実行時には:

0x804d26e DoSomething
0x804d29c checkReference

オフセットは0x2Eです。

関数間のオフセットはどういうわけか異なります。なぜ違うのですか?vtableは同じだと思うので、オフセットは同じである必要があります。

4

2 に答える 2

0

その理由は、nmがシンボルの仮想アドレスを返すためです。共有ライブラリは通常、シンボルテーブル、データセクションをさまざまな場所に格納します(ELF形式を確認してください)。nmはシンボルテーブルのアドレスを返します。ただし、ライブラリをロードすると、ローダーはシンボルテーブルを検索し、各関数のデータセクションをロードするため、実行時にアドレスオフセットが変更されます。

于 2012-07-17T04:14:00.890 に答える
0

以下は、シンボルテーブルのインデックスである可能性があります。

0xd52=>DerivedModel::DoSomething()
0xd94=>DerivedModel::checkReference()
于 2012-07-17T07:43:35.210 に答える