2番目の読み取り専用プログラム固有のメモリセグメントにはどのデータが格納されますか?

2番目の読み取り専用プログラム固有のメモリセグメントにはどのデータが格納されますか?

私はメモリ管理について学んでおり、私のプログラムに関連する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/sleepDebian 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

これ最下位ビットこの部分を記録してみてください。

おすすめ記事