Virtual-Memory
什麼數據儲存在第二個只讀程序特定記憶體段中?
我正在學習記憶體管理,並且試圖確定特定於我的程序的第二個只讀記憶體段正在儲存什麼。
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.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
LSB記錄了這些部分。