3

stack 、 heap 、および共有ライブラリのアドレス範囲がどこから始まるかを見ていました。共有ライブラリ (私が作成したもの) と a.out の 2 つの値が表示されます。ld と libc の 3 つの値。残りは匿名で、領域の開始アドレスをスタックします。

kg>pmap 24545
24545:   ./a.out

003d3000      4K r-x--    [ anon ]
004d9000      4K r-x--  /home/trng3/sh/POC/libfile_sys.so
004da000      4K rwx--  /home/trng3/sh/POC/libfile_sys.so
08048000      4K r-x--  /home/trng3/sh/POC/a.out
08049000      4K rwx--  /home/trng3/sh/POC/a.out
46f46000    100K r-x--  /lib/ld-2.5.so
46f5f000      4K r-x--  /lib/ld-2.5.so
46f60000      4K rwx--  /lib/ld-2.5.so
46f68000   1244K r-x--  /lib/libc-2.5.so
4709f000      8K r-x--  /lib/libc-2.5.so
470a1000      4K rwx--  /lib/libc-2.5.so
470a2000     12K rwx--    [ anon ]
b7f8a000      4K rw---    [ anon ]
b7fa1000      4K rw-s-  /dev/zero (deleted)
b7fa2000      8K rw---    [ anon ]
bfc0f000     84K rw---    [ stack ]

1 つではなく 2 つのコピーがあるのはなぜですか。1 つはディスクからのもので、もう 1 つは現在メモリ内にあります。同じデータの 2 つのコピーをメモリに保持する目的は何ですか?

4

2 に答える 2

2

それらは複数のコピーではなく、異なる権限を持つ異なるセグメントです。実行可能ファイルを見てください:

08048000 4K rx-- /home/trng3/sh/POC/a.out
08049000 4K rwx-- /home/trng3/sh/POC/a.out

r-x最初のマッピングには権限があり、2 番目のマッピングには権限があることがわかりますrwx。通常、2 番目のマッピングにはrwアクセス許可がありますが、プロセッサが非実行アクセス許可を設定できないか、機能がオフになっている可能性があります。プログラムが実行可能データ セグメントでコンパイルされているか、プロセッサに権限がない可能性があります。必要な粒度。

PAE を使用しない i386 の NX ビットの粒度は非常に粗いため、データ セグメントは実行可能であるがスタックは実行できない理由を説明できると思います。

于 2013-04-09T15:52:14.493 に答える
0
46f46000    100K r-x--  /lib/ld-2.5.so    
46f5f000      4K r-x--  /lib/ld-2.5.so

46f5f000 - 46f46000 = 25 * 4k = 100k。ファイルの最後のセグメントです。理由はまだ説明できませんが、これを見つけました。

于 2013-04-09T15:54:26.877 に答える