栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

我认为解析

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

否则,通常

ld
添加一个符号,该符号标记elf中所有段的结尾,并且该符号称为
_end
。例如:

extern void *_end;printf( "%pn", &_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; int main(){    void *p = calloc(10000,1);    printf( "end:%p heap:%p rodata:%p data:%pn", &_end, p, ppp1, ppp0 );    sleep(10000);     return 0;}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390843.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号