0

我的程序在其执行的某个时刻,逐行读取它自己的 /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]

我只期待四个部分:代码、常量、静态变量、堆;但在这里,有五个。第一个显然必须是代码,最后一个是堆。也许第二个是常数——但是另外两个是什么?谢谢!

4

2 回答 2

2

初始化的静态变量后跟未初始化的静态变量 (.BSS) - 不需要存储在二进制文件中。

于 2010-11-23T20:31:10.697 回答
1

第一个是可执行部分本身(由于 x 位),第二个可能是.rodata(没有 w 位),第三个是其他所有部分(.bss.data)。第四个是一些mmap调用 using的结果MAP_ANONYMOUS。请注意,malloc(3)可以很好地使用mmap(2)而不是sbrk(2)来实现。那里的[heap]对象是经典的 sbrk-heap(仅此而已),并且不包括使用 mmap 获得的私有可写区域。传统堆栈将被列为[stack],但子线程堆栈可以使用任何内存区域来存储它们的堆栈,通常是 malloc 的东西,所以你也不会看到多个[stack]s...

混乱完成了吗?:-)

于 2010-11-23T22:09:11.627 回答