如何以编程方式获取Linux上的堆地址

时间:2010-08-25 11:12:58

标签: c linux heap

我可以使用sbrk(0)获取堆末尾的地址,但有没有办法以编程方式获取堆的起始地址,而不是通过解析/proc/self/maps的内容?

1 个答案:

答案 0 :(得分:12)

我认为解析/proc/self/maps是Linux上唯一可靠的查找堆段的方法。并且不要忘记一些分配器(包括我的SLES中的一个)确实用于大块mmap(),因此内存不再是堆的一部分,可以在任何随机位置。

否则,通常ld会添加一个符号,该符号标记elf中所有段的结尾,并且该符号称为_end。 E.g:

extern void *_end;
printf( "%p\n", &_end );

它匹配.bss的末尾,传统上是精灵的最后一段。在地址之后,通过一些对齐,通常在堆之后。 Stack(s)和mmap()s(包括共享库)位于地址空间的较高地址。

我不确定它是多么可移植,但显然它在Solaris 10上的工作方式相同。在HP-UX 11上,映射看起来不同,堆似乎与数据段合并,但分配确实发生在{ {1}}。在AIX上,_end根本不显示堆/数据段,但分配也会使地址超过procmap符号。所以它似乎目前非常便携。

尽管如此,我不确定它是多么有用。

P.S。测试程序:

_end