代码之家  ›  专栏  ›  技术社区  ›  jchl

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

  •  9
  • jchl  · 技术社区  · 15 年前

    我可以用 sbrk(0) ,但是除了解析堆的内容之外,有没有其他方法可以通过编程方式获取堆的起始地址呢 /proc/self/maps ?

    1 回复  |  直到 15 年前
        1
  •  12
  •   Dummy00001    15 年前

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

    否则,通常 ld 添加一个标记elf中所有段结束的符号,该符号称为 _end

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

    它与 .bss

    我不确定它的可移植性如何,但显然它在solaris10上的工作方式是相同的。在HP-UX11上,映射看起来不同,堆似乎与数据段合并,但分配确实发生在 . 在AIX上, procmap _结束 符号。看来是这样 携带方便。

    不过,综合考虑,我不确定这有多有用。

    #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;
    }