我的程序在执行的某个时刻逐行读取它自己的/ proc / self / maps,直到(并包括)堆。该程序的路径是“/ home / t4”。这是输出:
00400000-00403000 r-xp 00000000 68:06 21629911 /home/t4
00602000-00603000 r--p 00002000 68:06 21629911 /home/t4
00603000-00604000 rw-p 00003000 68:06 21629911 /home/t4
00604000-00608000 rw-p 00000000 00:00 0
01905000-01926000 rw-p 00000000 00:00 0 [heap]
我只期待四个部分:代码,常量,静态变量,堆;但在这里,有五个。第一个显然必须是代码,最后一个是堆。也许第二个是常数 - 但那么另外两个是什么?谢谢!
答案 0 :(得分:2)
初始化的静态变量之后是未初始化的静态变量(.BSS) - 它们不需要存储在二进制文件中。
答案 1 :(得分:1)
第一个是可执行部分本身(由于x位),第二个可能是.rodata
(缺少w位),第三个是其他所有(.bss
和{{1} })。第四个是使用.data
进行mmap
调用的结果。请注意,使用MAP_ANONYMOUS
(2)而不是malloc
(2)可以很好地实现mmap
(3)。 sbrk
对象存在经典的sbrk-heap(仅限于此),并且不包括使用mmap获取的私有可写区域。传统的堆栈将被列为[heap]
,但是子堆栈可以使用任何内存区域来存储它们的堆栈,通常是malloc'd,所以你不会看到多个[stack]
...
混乱完成了吗? : - )