我有一个C / C ++变量可与我的指针。 是否有可能准确地辨认出这个变量属于哪个内存段? 如果是的话,怎么样?
注:我只是有这个变量的地址,如果变量没有进一步的信息是局部/全局等。
我有一个C / C ++变量可与我的指针。 是否有可能准确地辨认出这个变量属于哪个内存段? 如果是的话,怎么样?
注:我只是有这个变量的地址,如果变量没有进一步的信息是局部/全局等。
找出你的架构是否有指向你的堆或堆栈区。 通常有一些stackpointers或framepointers ..
然后,您的实际地址与这些地址,决定属于他们的地方。
如果您使用的是Linux(不知道其他Unix系统),你也许可以找到该文件中的信息/proc/<pid>/maps
你可以先确定哪些是开始,在你的可执行文件的不同部分的结束。 对于这一点,你需要最终在周围像这样各部分的连接器脚本中添加一些变量:
SECTIONS {
[...]
.data : {
data_start = .;
*(.data)
data_end = .;
}
[...]
}
然后,您可以在您的C / C ++代码声明这些变量作为外部和直接使用它们来比较,你需要确定的地址。
它可能不是很容易调整链接脚本。 与海湾合作委员会,你可以转储:
gcc -Wl,-verbose whatever.c
然后尝试寻找在(乱)产量已定义的变量。
要获得堆栈的界限,你可以在你的main()函数的开始实例化一个虚拟变量,它的地址保存为堆栈的顶部,然后实例化一个又一个的当前位置,这将给你的底部。 但是,请注意,编译器可能不表现得完全像这样(在C变量的堆叠顺序没有保证,甚至没有使用栈),所以这应该工作,但不便于携带。
最后,对于堆,我也没招。 我只想推断变量未在数据/ BSS /推导,而不是在堆栈将在堆(不包括寄存器,但如果你能得到的地址,我敢打赌,编译器将永远不会使用一个唯一的寄存器存储)。
我完全不知道这是否符合你的情况,但你可以尝试objdump -t
看到一个ELF文件的符号表。 所有你需要的是你的变量的地址。 在那里,你可以找到它的标志显示每个变量的部分。 请参阅手册页objdump
更多细节。
输出示例:
0804a020 g O .bss 00000004 var
它说, var
是一个g
叶形O
bject在地址0804a020
,部分.bss