Virtual-Memory

什麼數據儲存在第二個只讀程序特定記憶體段中?

  • January 30, 2017

我正在學習記憶體管理,並且試圖確定特定於我的程序的第二個只讀記憶體段正在儲存什麼。

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

我認為,我已經將較低範圍段標識為儲存執行程式碼和常量全域變數的程式碼段(或文本段)。我也相信第三段,具有讀/寫訪問權限,是我們儲存全域和靜態變數的數據段。

我的研究告訴我,有一個名為 BSS 的段儲存未初始化的變數。但是地址 00600000-00601000 之間的第二個記憶體段顯示為只讀,肯定會有未初始化的變數,(如何初始化它們?)。

我的理論是我們在這裡儲存了全域常量變數,但研究和實驗表明情況並非如此,因為它儲存在文本段中。

我還閱讀了一個只讀數據段(rodata),據我了解,它應該包含靜態常量數據,是這樣嗎?為什麼我的常量全域變數儲存在這裡?

我正在使用 gcc 來編譯我的測試程序。

r--p表示只讀且不可執行的段。對於典型的 ELF 執行檔,它包含一些連結器資訊。您可以執行objdump -D a.outreadelf -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

LSB記錄了這些部分。

引用自:https://unix.stackexchange.com/questions/341035