【问题标题】:Segments up to heap in /proc/self/maps output在 /proc/self/maps 输出中最多堆的分段
【发布时间】:2011-05-14 16:54:05
【问题描述】:

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

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

【问题讨论】:

    标签: c operating-system linux-kernel virtual-memory


    【解决方案1】:

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

    【讨论】:

    • 谢谢!为什么我不能调用 mprotect 将(已经映射的)初始化的静态变量段设置为只读,有什么原因吗?执行此操作时会出现段错误,而我可以将未初始化的静态变量和堆段设置为只读而没有任何段错误。
    • 取决于里面有什么。如果您的程序立即修改了某些内容,那么当然有段错误。例如,.got 全局偏移表,用于链接。
    【解决方案2】:

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

    混乱完成了吗? :-)

    【讨论】:

    • 第四个实际上可能是.bss,因为.bss段不占用二进制文件中的任何空间,因此无法从那里映射。
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 2015-01-10
    • 2016-04-05
    • 2014-03-15
    • 1970-01-01
    • 2011-04-21
    • 2016-11-28
    • 2014-01-10
    相关资源
    最近更新 更多