如何在Linux上以编程方式获取堆的地址
我可以使用来获取堆末尾的地址sbrk(0)
,但是除了解析内容之外,有什么方法可以以编程方式获取堆头的地址/proc/self/maps
吗?
回答:
我认为解析/proc/self/maps
是Linux上找到堆段的唯一可靠方法。并且不要忘记某些分配器(包括我的SLES中的分配器)确实用于大块,mmap()
因此内存不再是堆的一部分,可以位于任何随机位置。
否则,通常ld
添加一个符号,该符号标记elf中所有段的结尾,并且该符号称为_end
。例如:
extern void *_end;printf( "%p\n", &_end );
它与.bss
elf 的末尾(传统上是elf
的末尾)匹配。在地址之后,经过一定对齐后,通常跟随堆。堆栈和mmap()(包括共享库)位于地址空间的较高地址。
我不确定它的可移植性,但是显然它在Solaris 10上的工作方式相同。在HP-UX
11上,映射看起来不同,并且堆似乎与数据段合并,但是分配的确在_end
。之后发生。在AIX上,procmap
根本不显示堆/数据段,但是分配也获得了超出_end
符号的地址。因此,它似乎是
在目前 相当便携。
虽然,所有考虑,我不确定这有多有用。
PS测试程序:
#include <stdio.h>#include <stdlib.h>
char *ppp1 = "hello world";
char ppp0[] = "hello world";
extern void *_end; /* any type would do, only its address is important */
int main()
{
void *p = calloc(10000,1);
printf( "end:%p heap:%p rodata:%p data:%p\n", &_end, p, ppp1, ppp0 );
sleep(10000); /* sleep to give chance to look at the process memory map */
return 0;
}
以上是 如何在Linux上以编程方式获取堆的地址 的全部内容, 来源链接: utcz.com/qa/399302.html