如果识别一个地址属于堆或叠层或寄存器(Identifying if an address belon

2019-09-20 21:09发布

我有一个C / C ++变量可与我的指针。 是否有可能准确地辨认出这个变量属于哪个内存段? 如果是的话,怎么样?

注:我只是有这个变量的地址,如果变量没有进一步的信息是局部/全局等。

Answer 1:

找出你的架构是否有指向你的堆或堆栈区。 通常有一些stackpointers或framepointers ..

然后,您的实际地址与这些地址,决定属于他们的地方。



Answer 2:

如果您使用的是Linux(不知道其他Unix系统),你也许可以找到该文件中的信息/proc/<pid>/maps



Answer 3:

你可以先确定哪些是开始,在你的可执行文件的不同部分的结束。 对于这一点,你需要最终在周围像这样各部分的连接器脚本中添加一些变量:

SECTIONS {
    [...]
    .data : {
        data_start = .;
        *(.data)
        data_end = .;
    }
    [...]
}

然后,您可以在您的C / C ++代码声明这些变量作为外部和直接使用它们来比较,你需要确定的地址。

它可能不是很容易调整链接脚本。 与海湾合作委员会,你可以转储:

gcc -Wl,-verbose whatever.c

然后尝试寻找在(乱)产量已定义的变量。

要获得堆栈的界限,你可以在你的main()函数的开始实例化一个虚拟变量,它的地址保存为堆栈的顶部,然后实例化一个又一个的当前位置,这将给你的底部。 但是,请注意,编译器可能不表现得完全像这样(在C变量的堆叠顺序没有保证,甚至没有使用栈),所以这应该工作,但不便于携带。

最后,对于堆,我也没招。 我只想推断变量未在数据/ BSS /推导,而不是在堆栈将在堆(不包括寄存器,但如果你能得到的地址,我敢打赌,编译器将永远不会使用一个唯一的寄存器存储)。



Answer 4:

我完全不知道这是否符合你的情况,但你可以尝试objdump -t看到一个ELF文件的符号表。 所有你需要的是你的变量的地址。 在那里,你可以找到它的标志显示每个变量的部分。 请参阅手册页objdump更多细节。

输出示例:

0804a020 g     O .bss   00000004              var

它说, var是一个g叶形O bject在地址0804a020 ,部分.bss



文章来源: Identifying if an address belongs to heap or stack or registers