我正在学习内存管理,并试图确定特定于我的程序的第二个只读内存段正在存储什么。
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 来编译我的测试程序。
答案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
这最低有效位记录这些部分。