私はPHPをデバッグしています。私が知っているメモリの場所を見ているとき、私はポインタを参照しています - 例えば22810408(0x08048122) - これはPHPのCLIバージョンを使用しているときです。なぜapacheはphp-cliが仮想メモリアドレスを保持するメモリにオフセットを保持していますか?
しかし、私がapache2を使って同じことをしようとすると、実際のアドレスへのポインタは表示されません。代わりに、私はELFヘッダーのオフセットに、ELFヘッダーのアドレスに追加されたときに私に「本当の」アドレスを与えることを見ています。 たとえば、「実際の」アドレスが0x08048122で、ELFヘッダーが0x08048000の場合、同じ位置に22010000(0x122)が表示されます。
スタックにあるものの「実際の」アドレスを把握しようとすると、問題が発生します。 "本当の"アドレスは0xbfccxxxxとされていますが、ELFヘッダに見つかった番号を追加すると、物事は加算されません!私はすべての間違ったアドレスを取得します。
私は長い間、すでにグーグルを試みてきましたが、これを正確にどのように語るのか、何を検索するのかは本当に分かりません。
私が本質的に探しているのは、Apacheが実際のメモリアドレスの代わりにオフセットを持つ理由と、これがスタック上のアドレスにどのように関係しているかに関する情報です。誰も私に明確なかもしれない材料へのポインタを教えてもらえますか?
実行中のプロセスのアドレスではなく、まだロードされていない実行可能ファイルでオフセットを調べることができますか? – ugoren
それはおそらくそれが動作する方法です。これがどのように機能するかについての情報はありますか? – optional
あなたの "ポインタ"は私にグーグルグーグルで良い結果をもたらしました。それはapacheには、phpが実際の実行可能ファイルではなく、.soであるようです。だから、私はオフセットが実際のアドレスではなく、これが原因だと思っています。私がまだ完全に理解していないのは、「オフセット」から実際の仮想メモリアドレスに移動する方法です。私はまだ読んでいるが、明確化または義務的な読書は大いに感謝されるだろう。少なくともELFアドレスを追加して正しいものを手に入れることができないことは少なくとも理解しています。再配置テーブルを解析する必要があるようです。 – optional