私はメモリ管理について学んでおり、私のプログラムに関連する2番目の読み取り専用メモリセグメントに何が格納されているかを確認したいと思います。
00400000-00401000 r-xp 00000000 00:28 144 /a.out
00600000-00601000 r--p 00000000 00:28 144 /a.out
00601000-00602000 rw-p 00001000 00:28 144 /a.out
私の考えでは、サブスコープセグメントを実行コードと定数グローバル変数が格納されているコードセグメント(またはテキストセグメント)で識別したようです。また、読み取り/書き込みアクセス権を持つ3番目のセグメントは、グローバル変数と静的変数を格納するデータセグメントだと思いました。
私の研究では、初期化されていない変数が格納されるBSSというセグメントがあります。ただし、アドレス00600000と00601000の間の2番目のメモリセグメントは読み取り専用としてマークされ、そこには初期化されていない変数が必要です(初期化方法)。
私の理論は、ここにグローバル定数変数を格納することです。しかし、研究と実験によると、テキストセグメントに保存されているため、そうでないことがわかりました。
また、読み取り専用データセグメント(rodata)についても読みました。私が理解したところ、このセグメントには静的定数データが含まれているようです。これはまさにこれですか?定数グローバル変数がここに格納されるのはなぜですか?
私はテストプログラムをコンパイルするためにgccを使用しています。
ベストアンサー1
r--p
読み取り専用で実行できないセグメントを示します。一般的なELF実行可能ファイルの場合は、一部のリンカー情報が含まれています。実行するか、objdump -D a.out
このreadelf -a a.out
段落の内容を表示できます。たとえば、readelf -a /bin/sleep
Debian Linuxのx86_64では、セグメントに次の部分が表示されます。
[18] .init_array INIT_ARRAY 0000000000606e10 00006e10
0000000000000008 0000000000000000 WA 0 0 8
[19] .fini_array FINI_ARRAY 0000000000606e18 00006e18
0000000000000008 0000000000000000 WA 0 0 8
[20] .jcr PROGBITS 0000000000606e20 00006e20
0000000000000008 0000000000000000 WA 0 0 8
[21] .dynamic DYNAMIC 0000000000606e28 00006e28
00000000000001d0 0000000000000010 WA 6 0 8
[22] .got PROGBITS 0000000000606ff8 00006ff8
0000000000000008 0000000000000008 WA 0 0 8
これ最下位ビットこの部分を記録してみてください。