GDB如何知道可执行文件被重新定位到了哪里?

GDB如何知道可执行文件被重新定位到了哪里?,gdb,relocation,Gdb,Relocation,我知道Linux等现代操作系统并不总是在最初链接的同一地址执行应用程序。当调试器开始四处查看时,它需要知道原始链接地址和最终执行地址之间的关系。GDB如何计算偏移量 澄清:我不是说虚拟内存。也就是说,我(我相信)对虚拟内存是如何工作的有一个合理的理解,并且完全在该地址空间中操作。当我从ELF转储符号表时,符号位于一个位置,但当我从内存中获取它们的地址时,符号位于另一个位置 在这个特殊的例子中,我有一个字符串,它在链接的可执行文件中位于地址0x0E984141。在该进程的内存转储中,它位于地址0x

我知道Linux等现代操作系统并不总是在最初链接的同一地址执行应用程序。当调试器开始四处查看时,它需要知道原始链接地址和最终执行地址之间的关系。GDB如何计算偏移量

澄清:我不是说虚拟内存。也就是说,我(我相信)对虚拟内存是如何工作的有一个合理的理解,并且完全在该地址空间中操作。当我从ELF转储符号表时,符号位于一个位置,但当我从内存中获取它们的地址时,符号位于另一个位置


在这个特殊的例子中,我有一个字符串,它在链接的可执行文件中位于地址0x0E984141。在该进程的内存转储中,它位于地址0x0E3F2781。.rodata部分中的所有内容至少已移位0x5919C0。这似乎有点像地址空间布局随机化。

在Linux上,每个进程都有自己的内存


可执行文件包含一个头文件,描述内存中的段(以及它们在可执行文件中的相应部分)。

如果我理解您的意思,我认为您实际上指的是虚拟内存寻址,这不是由GDB处理的,而是由操作系统处理的

我知道Linux等现代操作系统并不总是在最初链接的同一地址执行应用程序

这仅适用于位置独立的可执行文件(与
-pie
标志链接)

当调试器开始四处查看时,它需要知道原始链接地址和最终执行地址之间的关系

GDB如何计算偏移量

与GDB计算共享库偏移量的方法相同(可执行文件是共享库的特例)。在
ld.so
和GDB之间有一个定义的接口,由
\u dl\u debug\u state()
函数(GDB在该函数上设置一个内部断点,并且每当它将一个新的
ELF
映像映射到进程中时,
struct r\u debug
调用该函数)。后者指向
struct link\u map
s的链接列表,该结构的
l\u addr
成员是链接地址和加载地址之间的偏移量