0

どの匿名仮想メモリ領域が libc によって作成/アクセスされているかを調べる方法はありますか?

mprotectアドレス空間で VMA を使用するプログラムがあります。ただし、mprotectlibc がアクセスする領域の場合は、SIGSEGV が発生します。残念ながら、私がインストールしたシグナル ハンドラーは、libc ではなく、私のコードで発生した障害のみを処理します。

詳細には、可変引数を使用しているため、私が得ている障害がありprintfます。構造reg_save_area内にある場所にアクセスしようとします。その場所は、以前編集va_listした匿名の VMA に属しています。mprotect

それで、私がそれらの領域である前に、これらの領域がどれであるかを知ることはありmprotectますか? または、少なくともstdarg.h配置する場所を知る方法はありreg_save_areaますか?

最もクリーンな方法は、libc 内で発生する SIGSEGV を処理することです。しかし、私はそのような方法があるとは思えません。

注: libc の data/bss セグメントは匿名ではないため、簡単に識別できます。私mprotectもその VMA を使用すると、未処理の SIGSEGV が発生するため、そうしないことにしました。

4

2 に答える 2

0

最もクリーンな方法は、libc 内で発生する SIGSEGV を処理することです。しかし、私はそのような方法があるとは思えません。

実際、C ライブラリのコード内で発生する SIGSEGV は処理できます。そして、私はそれらを扱います。SIGSEGV を処理できないのは、ハンドラー関数自体、またはmprotectionVMA を実行している関数内で発生するものです。

では、保護を解除する前にこれらの領域を知る必要はありますか? または、少なくとも stdarg.h が reg_save_area を配置することを選択した場所を知る方法はありますか?

@Artによる推奨以外に、libcによって作成された領域を知る方法はありませんが、私の問題の解決策は、ハンドラー自体によって使用されていたページの保護、または全体の保護メカニズム。

PS。私が尋ねた質問に単に答えていないので、これを私の質問に対する答えとは考えていません。それは私の元の問題を解決しましたが、それが私がそれを共有している理由です.

于 2015-07-26T16:01:52.263 に答える