4

ネイティブ Android ライブラリのコードがプロセスのアドレス空間で占めるアドレス範囲を見つけようとしています。私は読んで解析しています/proc/self/maps。ライブラリには 2 つのセクションがあります。1 つはコードで、もう 1 つはデータだと思います。私はそれらを区別する必要があります。ただし、それらの違いは、まあ、状況によるものです。Android 2.3.3 でのテスト。

コード セクションのパーミッションは r-xp、データのパーミッションは rwxp で、どちらも実行可能です。書き込み可能性に基づいて決定するのは不安です.Androidの同じフレーバーで、読み取り専用のデータセクションがある場合はどうなりますか?

もう 1 つの違いは、マップされたセクションのファイルに対する相対的なオフセットです。コード セクションのオフセットは 0 です。ここでも、リンカの一部の反復でコードの前にデータが配置される場合はどうなるでしょうか。

GDB や Android のスタック ウォーカーなどのツールは、コード アドレスがどのモジュールに属しているか、ライブラリ内のオフセットは何かを問題なく教えてくれます。言ってるだけ'。

編集: Android 4.0 では、セクションが異なります: r-xp、r--p、rw-p があります。これにより、実行可能セクションの失敗を簡単に特定できますが、以前の Android ではどうでしたか?

4

1 に答える 1

0

回避策を見つけました。幸いなことに、これらは私のライブラリであるため、独自のアドレスを返す関数を使用することで、コード ブロック内に確実に存在するアドレスを取得できます。次に、それをセクション境界と照合します。

void *TestAddress()
{
    return TestAddress; //That's within the code block, that's for sure.
}

インポートされた関数の関数アドレスは、実際の関数の本体ではなく、インポート サンクに対応するため、これはサード パーティのライブラリでは機能しません。

于 2013-02-28T16:23:34.560 に答える