什么数据存储在第二只读程序特定存储段中?

什么数据存储在第二只读程序特定存储段中?

我正在学习内存管理,并试图确定特定于我的程序的第二个只读内存段正在存储什么。

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.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

最低有效位记录这些部分。

相关内容