2010-11-23 3 views
0

私のプログラムは、実行中の特定の時点で、自身の/ proc/self/mapsを1行ずつ(ヒープを含むまで)読み込みます。プログラムのパスは "/ home/t4"です。ここに出力があります:/proc/self/maps出力のヒープまでのセグメント

00400000-00403000 r-xp 00000000 68:06 21629911 /home/t4 
00602000-00603000 r--p 00002000 68:06 21629911 /home/t4 
00603000-00604000 rw-p 00003000 68:06 21629911 /home/t4 
00604000-00608000 rw-p 00000000 00:00 0 
01905000-01926000 rw-p 00000000 00:00 0 [heap] 

コード、定数、静的変数、ヒープ、しかし、ここには5つあります。最初のコードは明らかにコードでなければならず、最後はヒープです。おそらく第2のものは定数ですが、他の2つは何ですか?ありがとう!

答えて

2

初期化された静的変数の後には、初期化されていない静的変数(.BSS)が続きます。この変数はバイナリに格納する必要はありません。

+0

ありがとう! mprotectを呼び出して、(すでにマップされている)初期化された静的変数セグメントを読み取り専用に設定できない理由はありますか?私はこれを行うときにsegfaultを取得しますが、初期化されていない静的変数とheapセグメントはsegfaultなしで読み取り専用にすることができます。 –

+1

はそこにあるものに依存します。あなたのプログラムによって直ちに修正されるものがあれば、もちろんsegfaultがあります。たとえば、リンクで使用される.gotグローバルオフセットテーブル。 –

1

最初の実行可能部分自体(Xビットによる)であり、第二は.rodata(Wビットが存在しない)可能性があり、第三は、他のすべて(.bss.data)です。 4番目はMAP_ANONYMOUSを使用してmmapコールの結果です。 malloc(3)は、sbrk(2)ではなくmmap(2)を使用して実装できます。 [heap]オブジェクトには古典的なsbrk-heap(そしてそれのみ)があり、mmapを使って得られたプライベートな書き込み可能な領域はカバーしません。従来のスタックは[stack]と表示されますが、サブスレッドのスタックはスタックを格納するために任意のメモリ領域を使用できます(通常malloc'dなので)。

混乱が完了しましたか? :-)

+2

第4のものは実際には '.bss'である可能性があります。なぜなら、' .bss'セグメントはバイナリ内のスペースを占有せず、そこからマッピングできないからです。 – caf

関連する問題