当我在GDB中运行程序时,GDB如何向我显示程序的虚拟地址?

时间:2017-09-19 01:43:08

标签: c debugging process gdb

我编译了一个简单的代码,我通过GDB运行它。

当我在GDB中运行我的简单程序时,GDB向我显示程序的虚拟地址(在程序的可执行目标文件中定义)。

GDB也是一个程序。所以GDB有自己的虚拟地址。因为GDB有自己的虚拟地址,当GDB mmap我的简单程序获取虚拟地址时,我的简单程序将在GDB的虚拟地址空间中拥有不同的虚拟地址。

但是GDB并没有告诉我那个地址。相反,GDB向我展示了我的简单程序的虚拟地址,该地址在我的简单程序的可执行目标文件中定义。

这是怎么发生的? GDB是否具有虚拟到虚拟地址表?

1 个答案:

答案 0 :(得分:1)

  

gdb也是一个程序。所以gdb有自己的虚拟地址。因为gdb有自己的虚拟地址,当gdb运行我的简单程序时,我的简单程序将在gdb的虚拟地址空间中有不同的虚拟地址。

非常困惑。

在任何现代操作系统上,gdb和你的程序都在不同的(虚拟)地址空间中运行,这些地址空间彼此无关,并且可以以任意方式重叠。

对于非位置无关的可执行文件,GDB和您的程序都将加载它们被链接到的加载的虚拟地址。您可以将该地址视为VirtAddr输出中第一个PT_LOAD段的readelf -l /path/to/a.out。在Linux / x86_64上,该地址(默认情况下)为0x400000

对于与位置无关的可执行文件,第一个PT_LOAD段的地址通常为0,并且可执行文件已重新定位。

如果您的二进制文件和GDB都是PIE,它们都将被重新定位,但它们不会共享地址空间,因此可以重新定位到完全相同的(虚拟)地址。