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